php находит значение в диапазоне массивов


У меня есть следующий массив:

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

Пользователь имеет возможность ввести любое числовое значение в текстовое поле, например "5". Теперь мне нужно отобразить пользователя, в какой группе находится это число. Я уже делал это раньше таким образом:

А затем выполните такой случай переключения:

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;

Однако это кажется невыполнимым, так как у нас много групп (вероятно, более 200), и использование такого количества вариантов переключения неэффективно.

Любые идеи о том, как решить эту проблему подробнее элегантно?

Author: ekad, 2014-05-06

3 answers

Я бы сделал массив:

$groups = array();

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

И затем

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

Или вы можете поместить их в базу данных

 6
Author: Bartłomiej Wach, 2014-05-06 14:50:23

Еще более быстрым способом было бы создать массив поиска, в котором пользовательский ввод является ключом для метки группы:

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

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

Конечно, массив поиска был бы довольно большим (в основном для нас, людей, а не для сервера). Если у вас есть шаблон во входных значениях (в вашем примере кажется, что это диапазон 10 секунд), вы можете вычислить хэш как ключ:

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

 echo 'you are in ' . $lookup[$hash];
 0
Author: cypherabe, 2014-05-06 15:03:56

Если ваши массивы хранятся в массиве $groups, например, вы можете использовать следующий цикл, а затем прерваться, когда найдете нужную группу:

foreach($groups as $i => $group) {
    if ($input >= $group[0] && $input < $group[1]) {
        printf("You are in group %d", $i);
        break;
    }
}
 0
Author: Abed Hawa, 2014-05-06 15:05:13