2014-05-06 36 views
4

我有以下的數組:PHP查找值

$groupA= array(1,10); 
$groupB = array(11,20); 
$groupC = array(21,30); 

用戶具有輸入任何數值到文本框,例如「5」現在我需要顯示用戶的可能性在哪個組中。我這樣之前已經這樣做了:

然後做一個開關的情況下是這樣的:

switch ($input){ 
    case ($input>= $groupA[0] && $input<= $groupA[1]): 
     echo "You are in Group A."; 
    break; 
    case ($input>= $groupB[0] && $input<= $groupB[1]): 
     echo "You are in Group B."; 
    break; 

然而,這似乎不是feasable,因爲我們有很多很多的組(可能超過200),並使用該許多交換機情況下效率不高。

關於如何解決這個更優雅的任何想法?

+0

我把他們都在同一個陣列'陣列( 1,10,11,20,21,30)'並進行二分搜索。找到的密鑰將告訴你它屬於哪個組。 – jeroen

回答

4

我會做一個數組:

$groups = array(); 

$groups['groupA'] = array('min'=>1,'max'=>100); 
$groups['groupB'] = array('min'=>1,'max'=>100); 

然後

foreach($groups as $label => $group) 
{ 
    if($input >= $group['min'] && $input <= $group['max']) 
    { 
     echo "You are in group $label"; 
     break; 
    } 
} 

,或者你可以把它們放在一個數據庫

0

如果您保存在一個數組$groups您的陣列來例如,您可以使用以下循環,然後在找到合適的組時打破:

foreach($groups as $i => $group) { 
    if ($input >= $group[0] && $input < $group[1]) { 
     printf("You are in group %d", $i); 
     break; 
    } 
} 
+0

你剛纔複製@BartłomiejWach的答案(嚴重...)? – jeroen

+0

這不是火箭科學!我實際上是在寫他的時候寫我的,不需要複製兄弟... –

+0

你可能想要printf而不是sprintf在這裏 – eis

0

更快的方式是創建一個查找陣列,用戶在其中輸入該組的功能鍵:

$lookup = array(1 => 'group A', 
        2 => 'group A', 
       //.. 
       10 => 'group B' //, ... 
       ); 

echo 'you are in ' . $lookup[$input]; 

當然,查找陣列會相當大(多爲美國人類,而不是服務器)。 如果你在你的輸入值的模式(在你的例子看起來就像是一個範圍10S的),你可以計算哈希關鍵:

$lookup = array(0 => 'group A', 
        1 => 'group B' //,.... 
       ); 
$hash = floor($input/10); 

echo 'you are in ' . $lookup[$hash];