2014-05-06 3 views
4

Je le tableau suivant:php valeur trouver dans la gamme de gamme

$groupA= array(1,10); 
$groupB = array(11,20); 
$groupC = array(21,30); 

L'utilisateur a la possibilité de saisir une valeur numérique dans une zone de texte, par exemple « 5 » maintenant, je dois montrer à l'utilisateur dans quel groupe ce nombre est. Je l'ai fait avant de cette façon:

Et puis faire un cas de commutation comme celui-ci:

switch ($input){ 
    case ($input>= $groupA[0] && $input<= $groupA[1]): 
     echo "You are in Group A."; 
    break; 
    case ($input>= $groupB[0] && $input<= $groupB[1]): 
     echo "You are in Group B."; 
    break; 

Cependant, cela semble feasable pas puisque nous avons beaucoup de groupes (probablement plus de 200) et l'utilisation de ce de nombreux commutateurs sont inefficaces.

Des idées sur la façon de résoudre cela plus élégamment?

+0

je les mettre tous dans un tableau '(1,10,11,20,21,30) 'et faire une recherche binaire. Les clés trouvées vous diront à quel groupe il appartient. – jeroen

Répondre

4

Je ferais un tableau:

$groups = array(); 

$groups['groupA'] = array('min'=>1,'max'=>100); 
$groups['groupB'] = array('min'=>1,'max'=>100); 

Et puis

foreach($groups as $label => $group) 
{ 
    if($input >= $group['min'] && $input <= $group['max']) 
    { 
     echo "You are in group $label"; 
     break; 
    } 
} 

ou vous pouvez les mettre dans une base de données

0

Si vous avez vos tableaux stockés dans un tableau pour $groups Par exemple, vous pouvez utiliser la boucle suivante, puis rompre lorsque vous trouvez le bon groupe:

foreach($groups as $i => $group) { 
    if ($input >= $group[0] && $input < $group[1]) { 
     printf("You are in group %d", $i); 
     break; 
    } 
} 
+0

Avez-vous simplement copié la réponse de @ BartłomiejWach (mal ...)? – jeroen

+0

Ce n'est pas sorcier! En fait, j'écrivais le mien quand il posait le sien, pas besoin de copier mec ... –

+0

vous voudriez probablement printf au lieu de sprintf ici – eis

0

un serait de créer un tableau de recherche encore plus rapide, dans lequel l'entrée utilisateur est la clé de l'étiquette du groupe:

$lookup = array(1 => 'group A', 
        2 => 'group A', 
       //.. 
       10 => 'group B' //, ... 
       ); 

echo 'you are in ' . $lookup[$input]; 

bien sûr, le tableau de recherche serait assez grand (la plupart du temps pour nous les humains, pas tellement pour le serveur). Si vous avez un modèle dans vos valeurs d'entrée (dans votre exemple, il semble que c'est une gamme de 10s), vous pouvez calculer un hachage comme la clé: tableau

$lookup = array(0 => 'group A', 
        1 => 'group B' //,.... 
       ); 
$hash = floor($input/10); 

echo 'you are in ' . $lookup[$hash];