2012-11-14 60 views
3

因此,我編寫了一個函數,它可以深入到數組中尋找鍵和子鍵對的兩個級別。基本上它正在尋找key['subkey'],如果它發現它,返回key['subkey']PHP - 在鍵和子鍵上遞歸搜索數組,成功返回鍵['subkey]

我在尋找的是一種以真正遞歸的方式完成此操作的方法,並根據需要深度搜索多個級別,直到它到達數組的末尾並強制返回false或找到值並返回它。

我在PHP上完全陌生,而且我已經搜索了幾個小時而沒有任何結果。任何指針正確的方向將不勝感激。

這是函數:

function searchArray($array, $key, $subkey) { 
    foreach ($array as $item){ 
     if (is_array($item) && isset($item[$key]) && isset($item[$key][$subkey])){ 
      return $item[$key][$subkey]; 
     } else { 
      foreach ($item as $subitem){ 
       if (is_array($subitem) && isset($subitem[$key]) && isset($subitem[$key][$subkey])){ 
        return $subitem[$key][$subkey]; 
       } 
      } 
     } 
    } 
} 

樣本數組:

"locales" => array(
    "America" => array(
     "locations" => array(
      "us" => array(
       "title" => "United States", 
       "lang" => "en_US", 
      ), 
      "gl" => array(
      ) 
     ) 
    ), 
    "Europe" => array(
     "locations" => array(
      "at" => array(
       "title" => "Österreich", 
       "lang" => "de_DE", 
      ), 
      "fr" => array(
       "title" => "France", 
       "lang" => "fr_FR", 
      ), 
      "de" => array(
       "title" => "Deutschland", 
       "lang" => "de_DE", 
      ), 
      "it" => array(
       "title" => "Italy", 
       "lang" => "it_IT", 
      ), 
      "uk" => array(
       "title" => "United Kingdom", 
       "lang" => "en_GB", 
      ) 
     ) 
    ), 
    "Africa" => array(
     "locations" => array(
      "za" => array(
       "title" => "Südafrika", 
       "lang" => "en_ZA", 
      ) 
     ) 
    ), 
    "Asia & Pacific" => array(
     "locations" => array(
      "au" => array(
       "title" => "Australia", 
       "lang" => "en_AU", 
      ), 
      "cn" => array(
       "title" => "中國", 
       "lang" => "zh_CN", 
      ), 
      "hk" => array(
       "title" => "香港", 
       "lang" => "zh_CN", 
      ), 
      "jp" => array(
       "title" => "日本", 
       "lang" => "jp_JP", 
      ), 
      "kr" => array(
       "title" => "한국", 
       "lang" => "ko_KR", 
      ) 
     ) 
    ) 
) 

調用searchArray($siteOptions['locales'], 'us', 'lang')應該返回'en_US'

回答

3
function walk($array, $key, $option) { 
    if(!is_array($array)) { 
     return false; 
    } 
    foreach ($array as $k => $v) { 
     if($k == $key && is_array($v) && isset($v[$option])){ 
      return $v[$option]; 
     } 
     $data = walk($v, $key, $option); 
     if($data != false){ 
      return $data;   
     } 
    } 

    return false; 
} 

echo walk($array, 'jp', 'lang'); 
+0

我不得不在foreach循環中包含if(is_array($ array){}',除此之外,完美!非常感謝。 – StephenRios

0

嘗試使用array_walk_recursive()http://us1.php.net/function.array-walk-recursive

它不會做的正是你想用默認的東西;你將不得不編寫一些代碼來檢查子鍵和什麼。

+2

通過打我給它10秒;-) –

+1

我本來試圖用array_walk_recursive,但是當有索引數組與關聯數組混合不正確返回值。 – StephenRios

+0

你可以發佈一個小樣本數組嗎?它聽起來像你想做的事可以通過遞歸調用'array_walk_recursive()'來完成(即在你傳遞給'array_walk_recursive()'的可調用函數內部)。 – sgroves

2
function searchArray($arr, $key, $subkey) { 
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr), RecursiveIteratorIterator::SELF_FIRST); 
    $found = false; 
    foreach($it as $k => $v) { 
     if ($k == $key && !$found) $found = true; 
     elseif ($k == $subkey && $found) return $v; 
    } 
    return false; 
} 
+0

試過這個,但是$ k永遠不會返回我正在查找的值,所以我無法搜索它 – StephenRios

+1

@StephenRios我寫了在你發佈數組樣本之前的原始版本,這個是簡短而又甜蜜的,並且做到了這一點,我爲這個選中的標記太晚了,但我想我會把它留在這裏以供後代使用LOL – keyboardSmasher

+0

這個版本也適用於保存了幾行代碼。很好!現在,如果我明白他們是如何工作的,大家好! – StephenRios