-1

我有一个存储数值的数组。像这样:

$ranges = array(1=> '33', 2=> '66', 3=> '99');

我有一个名为的变量$result,它给我一个介于 0-100 之间的动态值。

例如:

  • 如果$result等于或大于 33 且小于 66,则返回的键应为 1
  • 如果$result等于或大于 66 且小于 99,则返回的键应为 2
  • 如果$result等于或大于 99,则返回的 key 应该是 3

关于如何实现这一点的任何想法?

4

3 回答 3

1

根据您的条件

  1. 当 33 <= 结果 < 66 则 getRangeIndex = 1
  2. 当 66 <= 结果 < 99 时 getRangeIndex = 2
  3. 当 99 <= 结果时 getRangeIndex = 3

函数可能是这样的:

function getRangeIndex( $i ) {

    $ranges = array(1=> '33', 2=> '66', 3=> '99');
    $prevValue = 0;
    $prevKey = null;
    foreach( $ranges as $currKey=>$currValue ) {
        if( $prevValue <= $i && $i < $currValue ) {
            return $prevKey;
        }
        $prevValue = $currValue;
        $prevKey = $currKey;
    }
    return $currKey;
}

测试功能的简单循环:

for( $result = 0 ; $result <= 100 ; $result++ ) {
    echo "$result - " . getRangeIndex( $result ) . "\n";
}
于 2013-09-30T16:10:33.797 回答
1

您如何处理这部分取决于您希望条件逻辑的动态程度。如果您只是检查这个值数组,那么设置几个ifandelse if语句的序列是微不足道的。

但是,如果您希望它更具动态性,您应该首先重新排列您的输入。当您像以前那样组织阵列时,您会混淆不同的极限值。33是范围的排他上限0,66是范围的排他的上限1,99是范围的排他的上限2,100是范围的包括上限3

一个简单的解决方案是简单地将 33、66 和 99 的值下移 1 并遍历列表以<=检查该范围。这意味着 32 将返回0,33 将返回1,但 32.5 也会返回1。因此,如果没有任何其他信息,这将为您提供所需的信息:

$ranges = array(0 => 33, 1 => 66, 2 => 99, 3 => 101);

foreach ($ranges as $key => $value)
{
    if ($result < $value)
    {
        $best = $key;
        break;
    }
}
于 2013-09-30T16:15:28.320 回答
0

如果您的范围始终按顺序排列,则无需检查下限,因此可以使用以下方法:

$resndx= 0;
foreach($ranges as $key=>$value) {
    if ($value > $result) {
        break;
    }
    $resndx= $key;
}

echo "Result $result is in $resndx";
于 2013-09-30T16:13:19.603 回答