2013-09-30 45 views
-1

我有一个存储数值的数组。像这样:将数值放入数组范围

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

我有一个叫$result变量,让我在0-100之间的动态值。

例如:

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

上ħ任何想法这可以实现吗?

+0

如果使用其他ELSEIF这是最好的做法 – RDK

+1

写作是你遇到问题的逻辑的哪一部分? – Kermit

+0

我发现很难应用如果其他规则来搜索数组值并返回密钥 –

回答

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"; 
} 
0

如果你的范围总是为了你不会需要检查的下限,所以像这样的工作:

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

echo "Result $result is in $resndx"; 
1

您如何解决这个问题部分取决于您希望条件逻辑的动态性如何。如果您只是检查这个值的数组,那么设置几个ifelse 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; 
    } 
}