在PHP中查找数组范围内的值

4

我有以下数组:

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

用户有可能在文本框中输入任何数字,例如“5”,现在我需要告诉用户该数字属于哪个组。我以前是这样做的:
然后像这样使用 switch case:
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个),使用这么多的switch-case是低效的。你有什么更优雅的解决方案吗?

我会把它们都放在一个数组 array(1,10,11,20,21,30) 中,并进行二分查找。找到的键将告诉您它属于哪个组。 - jeroen
3个回答

7

我会创建一个数组:

$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;
    }
}

或者您可以将它们放入数据库中。


0
如果你的数组存储在一个名为$groups的数组中,你可以使用以下循环,当找到正确的组时就可以跳出循环:
foreach($groups as $i => $group) {
    if ($input >= $group[0] && $input < $group[1]) {
        printf("You are in group %d", $i);
        break;
    }
}

你刚刚是不是抄袭了@BartłomiejWach的答案(而且还很糟糕)? - jeroen
这不是火箭科学!我实际上是在他发布他的时候写我的,不需要抄袭,伙计... - Abed Hawa
这里可能需要使用printf而不是sprintf。 - eis

0

更快的方法是创建一个查找数组,其中用户输入是组标签的键:

 $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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接