2010-11-30 50 views
6

我有一個嵌套到未知/無限深度的多維數組。 我希望能夠遍歷每個元素。 我不想用,foreach(){foreach(){foreach(){}}}因爲我不知道深度。多維數組嵌套到無限深度

我最終尋找所有名爲「xyz」的嵌套數組。有沒有人有任何建議?

回答

1

使用上面的評論,我已經找到了答案:

function findXyz($array){ 
    foreach($array as $foo=>$bar){ 
     if (is_array($bar)){ 
     if ($bar["xyz"]){ 
      echo "<br />The array of xyz has now been found"; 
      print_r($bar['xyz']); 
     }else{ 
      findXyz($bar); 
     } 
     } 
    } 
} 
findXyz($myarray); 

這遍歷所有嵌套的數組,並查找誰擁有XYZ的子陣列,按我原來的任何元素請求。 array_walk_array和RecursiveIteratorIterator無法實現這一點。

3

遞歸。

編寫一個走一個數組的函數;對於每個也是數組的元素,它會調用它自己;否則,當它找到目標字符串時,它會返回。

+0

這個遞歸函數將需要使用或foreach – Thariama 2010-11-30 10:05:55

+0

是的,但只有一次。不具有硬編碼的嵌套級別。 – tdammers 2010-11-30 10:06:37

0

你有沒有想過爲此使用array_walk_recursive

另一(更慢)的方法將是flatten the array第一執行搜索之前,即:

$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p'))); 

function array_flatten($array,$return) 
{ 
    for($x = 0; $x <= count($array); $x++) 
    { 
     if(is_array($array[$x])) 
     { 
      $return = array_flatten($array[$x],$return); 
     } 
     else 
     { 
      if($array[$x]) 
      { 
       $return[] = $array[$x]; 
      } 
     } 
    } 
    return $return; 
} 

$res = array_flatten($myarray,array()); 

或者,對於遞歸搜索,看here中的示例:

function arrayRecursiveSearch($needle, $haystack, $path=""){ 
    if(!is_array($haystack)){ 
    die("second argument is not array"); 
    } 

    global $matches; 

    foreach($haystack as $key=>$value) 
    { 
    if(preg_match("/$needle/i", $key)){ 
     $matches[] = array($path . "$key/", "KEY: $key"); 
    } 

    if(is_array($value)){ 
     $path .= "$key/"; 
     arrayRecursiveSearch($needle, $value, $path); 
     unset($path); 
    }else{ 
     if(preg_match("/$needle/i", $value)){ 
     $matches[] = array($path . "$key/", "VALUE: $value"); 
     } 
    } 
    } 

    return $matches; 
} 

$arr = array("Asia"=>array('rambutan','duku'), 
       "Australia"=>array('pear','kiwi'), 
       "Arab"=>array('kurma')); 

print_r(arrayRecursiveSearch("ra",$arr)); 
+0

array_walk_recursive可以很好地工作,除了PHP.net文檔中的這個小句子:「您可能會注意到'sweet'這個鍵從不顯示。任何包含數組的鍵都不會傳遞給該函數。「 – stevenmc 2010-11-30 10:27:28

3

有一個浩浩蕩蕩區別未知和無限。但是,您可以使用SPL Iterators而不是使用多個嵌套的foreach循環。

實施例:

$array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
foreach($array_obj as $key => $value) { 
    echo $value; 
} 
1

看一看到RecursiveIteratorIterator接口。

$interface = new RecursiveIteratorIterator(new RecursiveArrayIterator($your_array)); 
foreach($interface as $k=>$v) { /* your function*/ } 
10

我最終尋找所有名爲「xyz」的嵌套數組。有沒有人有任何建議?

當然。在使用一些迭代器的建議的基礎上,你可以這樣做:

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($array), 
    RecursiveIteratorIterator::SELF_FIRST 
); 
foreach ($iterator as $key => $item) { 
    if (is_array($item) && $key === 'xyz') { 
     echo "Found xyz: "; 
     var_dump($item); 
    } 
} 

其他答案之間的重要區別這是正在被使用的RecursiveIteratorIterator::SELF_FIRST標誌,使非葉(即父母)項目(即數組)在迭代時可見。

你也可以圍繞數組迭代器使用ParentIterator,而不是檢查循環中的數組,以使後者更整潔一些。