2012-11-13 12 views
1

的例子,導致給定值的所有鍵:如何讓PHP迭代多級陣列時

$arr = array(array("name"=>"Bob","species"=>"human","children"=>array(array("name"=>"Alice","age"=>10),array("name"=>"Jane","age"=>13)),array("name"=>"Sparky","species"=>"dog"))); 
print_r($arr); 

array_walk_recursive($arr, function($v,$k) { 
    echo "key: $k\n"; 
}); 

這裏的事情是,我只得到了最後的關鍵,但我也沒辦法參考,我一直,即在我離開函數或在另一個相同數組中更改相同的放置值後,存儲特定的鍵和更改值。

我必須得到的,而不是字符串是一個數組,將有所有鍵導致給定的值,例如[0,"children",1,"age"]

編輯: 這個數組只是一個例子。我問過是否有通用的方法來在PHP中迭代嵌套數組,並獲得完整的位置路徑,而不僅僅是最後一個鍵。我知道有一種方法可以通過創建反映數組結構的嵌套循環來實現。但我再說一遍:我不知道陣列結構。

回答

2

要解決您的問題,您將需要遞歸。下面的代碼將做你想做的事情,如果它們存在,它也會找到多個路徑:

$arr = array(
    array(
     "name"=>"Bob", 
     "species"=>"human", 
     "children"=>array(
      array(
       "name"=>"Alice", 
       "age"=>10 
      ), 
      array(
       "name"=>"Jane", 
       "age"=>13 
      ) 
     ), 
     array(
      "name"=>"Sparky", 
      "species"=>"dog" 
     ) 
    ) 
); 

function getPaths($array, $search, &$paths, $currentPath = array()) { 
    foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      $currentPath[] = $key; 
      if (true !== getPaths($value, $search, $paths, $currentPath)) { 
       array_pop($currentPath); 
      } 
     } else { 
      if ($search == $value) { 
       $currentPath[] = $key; 
       $paths[] = $currentPath; 
       return true; 
      } 
     } 
    } 
} 

$paths = array(); 
getPaths($arr, 13, $paths); 
print_r($paths);