2013-01-09 59 views
0

我有一個數組$arr看起來像這樣:搜索在數組值和比較/獲取下一個和前一個值

array(3) { 
    [0]=> 
    array(2) { 
    ["food"]=> 
    string(5) "Toast" 
    ["age"]=> 
    string(2) "28" 
    } 
    [1]=> 
    array(2) { 
    ["food"]=> 
    string(5) "Pizza" 
    ["age"]=> 
    string(2) "45" 
    } 
    [2]=> 
    array(2) { 
    ["food"]=> 
    string(5) "Steak" 
    ["age"]=> 
    string(2) "33" 
    } 
} 

我還具有可變$curr_age = 45;

現在我正在尋找一種方法來搜索數組,直到找到$arr[$i]["age"] = $curr_age然後停止。
另外,我如何從下一個&以前的數組(例如Toast和Steak)中獲取食物?

對於通過陣列搜索,我有這樣的代碼:

$i = 0; 

foreach($arr as $array){ 

    if($curr_age == $arr[$i]["age"]) { 

     $next = $arr[$i++]["food"]; 
     $prev = $arr[$i--]["food"]; 

    } 

    $i++; 

} 

你大概可以想像,這並不如預期工作,我不知道爲什麼。有一件事讓我感到震驚,事實上foreach循環實際上只用於增加$i$array從不使用,但我無法弄清楚如何解決這個問題或如何執行上面提到的任務。

我想我已經發現在PHP中沒有「內置」的方式來做到這一點,需要額外的功能,但又一次:我不知道該功能需要做什麼。我甚至不確定這種說法是否屬實。

我已經試過array_search,然後簡單地遞增/遞減鍵1,但這並不是因爲我相信的兩個原因。首先看來array_search不能處理那種類型的數組&秒,這些密鑰可能是不連續的,所以$x++$x--似乎不正確。

+0

一個問題,我認爲之前也保持一個遞增的指數,只是用在foreach循環中的關鍵任務,並確保測試的前面和後面的按鍵確實存在是$ arr。把$ array放在$ arr中,如果條件和語句裏面條件是 –

+0

你的問題看起來像看不見的passage.question應該是short.i認爲foreach($ arr as $ keys => $ values)like –

回答

1

你的數組索引已經是數字那麼有沒有真正需要嘗試訪問它們

foreach ($arr as $k => $v) { 
    if ($v['age'] == $curr_age) { 
     if (isset($arr[$k-1])) { 
      $prev = $arr[$k-1]; 
     } 
     if (isset($arr[$k+1])) { 
      $next = $arr[$k+1]; 
     } 
     break; 
    } 
} 
+0

使用'$ k => $ v'的非常優雅的解決方案,我從來沒有想到過。謝謝! – Sven

1
$length = count($array); 
for ($i = 0; $i < $length; $i++) { 
    if($curr_age == $array[$i]["age"]) { 
    if (i<$length){ 
     $next = $array[$i+1]["food"]; 
    } 
    if (i>0){ 
     $prev = $array[$i-1]["food"]; 
    } 
    } 
} 

Answer for looping an array + your code = Solved。正如馬克·貝克指出的那樣,如果數組在分配之前未被檢查,則數組可能會得到錯誤的值。

+2

測試年齡匹配數組中的第一個和最後一個條目,否則你的$ prev或$ next分別會出錯 –

1

試試這個,比較通過在特定位置(這裏$陣列)的foreach分配的元素來比較,而不是$改編[$ i] [「時代」]

$i=0; 

foreach($arr as $array) 
{ 
    if($array['age'] == $curr_age) 
    { 
     $Previous = $arr[$i-1]['food']; 
     $Next = $arr[$i+1]['food']; 
     break; 
    } 

    $i++; 
}