2013-09-30 76 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; 
    } 
}