我有一个存储数值的数组 . 像这样:
$ranges = array(1=> '33', 2=> '66', 3=> '99');
我有一个名为 $result 的变量,它给出了0到100之间的动态值 .
$result
例如:
如果 $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"; }
您如何处理这部分取决于您希望条件逻辑的动态程度 . 如果你're simply checking against this array of values, it'设置几个 if 和 else if 语句的序列是微不足道的 .
if
else if
但是,如果您希望它更具动态性,您应该首先重新排列输入 . 像你一样组织数组've done, you'会混淆不同的限制值 . 33是 0 范围的上限,66是 1 范围的上限,99是 2 范围的上限,100是 3 范围的上限 .
0
1
2
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; } }
如果您的范围始终是有序的,则无需检查下限,因此这样的方法可行:
$resndx= 0; foreach($ranges as $key=>$value) { if ($value > $result) { break; } $resndx= $key; } echo "Result $result is in $resndx";
3 回答
为了你的条件
当33 <=结果<66时,则getRangeIndex = 1
当66 <=结果<99时,则getRangeIndex = 2
当99 <=结果时,getRangeIndex = 3
功能可能是这样的:
测试功能的简单循环:
您如何处理这部分取决于您希望条件逻辑的动态程度 . 如果你're simply checking against this array of values, it'设置几个
if
和else if
语句的序列是微不足道的 .但是,如果您希望它更具动态性,您应该首先重新排列输入 . 像你一样组织数组've done, you'会混淆不同的限制值 . 33是
0
范围的上限,66是1
范围的上限,99是2
范围的上限,100是3
范围的上限 .对此的一个天真的解决方案是简单地将您的33,66和99值向下移动1并迭代列表执行该范围的
<=
检查 . 这意味着32将返回0
并且33将返回1
,但32.5也将返回1
. 因此,如果没有任何其他信息,这将为您提供所需的信息:如果您的范围始终是有序的,则无需检查下限,因此这样的方法可行: