我有一个存储了数值的数组。 像这样:
$ranges = array(1=> '33', 2=> '66', 3=> '99');
我有一个名为 $result
的变量,它给了我一个介于 0-100 之间的动态值。
例如:
- 如果
$result
等于或大于 33 且小于 66,则返回的键应为 1 - 如果
$result
等于或大于 66 且小于 99,则返回的键应为 2 - 如果
$result
等于或大于 99,则返回的键应为 3
关于如何实现这一目标的任何想法?
针对您的条件
- 当 33 <= 结果<66 时,getRangeIndex = 1
- 当 66 <= 结果<99 时,getRangeIndex = 2
- 当 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";
}
如何处理此问题部分取决于您希望条件逻辑的动态程度。如果您只是检查此值数组,那么设置多个if
和else if
语句的序列是很简单的。
但是,如果您希望这更加动态,则应从重新排列输入开始。当您像以前一样组织数组时,您会混淆不同的极限值。33 是0
范围的排除上限,66 是1
范围的排除上限,99 是2
范围的排除上限,100 是3
范围的包含上限。
对此的一个天真的解决方案是简单地将 33、66 和 99 个值向下移动一个,然后遍历列表,对该范围执行<=
检查。这意味着 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;
}
}
如果你的范围总是井然有序,你不需要检查下限,所以这样的东西就可以了:
$resndx= 0;
foreach($ranges as $key=>$value) {
if ($value > $result) {
break;
}
$resndx= $key;
}
echo "Result $result is in $resndx";