2012-06-07 33 views
8

到目前爲止,如果我必須遍歷多維數組,我使用每個維度的foreach循環。有沒有辦法在不知道深度的情況下遍歷多維數組?

e.g兩個維度

foreach($array as $key=>$value) 
{ 
    foreach($value as $k2=>$v2) 
    { 
     echo 
    } 
} 

我該怎麼辦時,我不知道該陣列的深度?即深度是可變的。

我能想到的唯一的事情就是編寫一整個循環的堆棧,並在下一個值不是數組的時候打破循環。這看起來有點愚蠢。

有沒有更好的方法?

回答

16

是的,您可以使用recursion。這裏有一個例子,你輸出所有的數組中的元素:

function printAll($a) { 
    if (!is_array($a)) { 
    echo $a, ' '; 
    return; 
    } 

    foreach($a as $v) { 
    printAll($v); 
    } 
} 

$array = array('hello', 
       array('world', 
        '!', 
        array('whats'), 
        'up'), 
       array('?')); 
printAll($array); 

你應該總是記得這樣做時,遞歸是,你需要一個基本情況,你不會去任何更深。

我喜歡在繼續功能之前檢查基本情況。這是一個常見的習慣用語,但並非絕對必要。如果您應該輸出或執行遞歸調用,您還可以檢查foreach循環,但我經常發現代碼難以保持這種方式。

當前輸入和基本情況之間的「距離」被稱爲變量,它是一個整數。在每個遞歸調用中,變體應嚴格減少。上例中的變體是the depth of $a。如果您不考慮變體,那麼風險會以無限遞歸結束,並且最終腳本將因stack overflow而死亡。在遞歸函數之前準確記錄變體在評論中的含義並不少見。

+1

號使用內置array_walk_recursive()。 PHP吸引遞歸。 –

0

您可以使用遞歸針對此問題:

下面是一個例子

$array = array(1 => array(1 => "a", 2 => array(1 => "b", 2 => "c", 3 => array(1 => "final value")))); 

//print_r($array); 

printAllValues($array); 

function printAllValues($arr) { 
    if(!is_array($arr)) { 
     echo '<br />' . $arr; 
     return; 
    } 
    foreach($arr as $k => $v) { 
     printAllValues($v); 
    } 
} 

它將使用遞歸遍歷數組

這將打印像

a 
b 
c 
final value 
0

array_walk_recursive簡單的函數來顯示嵌套層次和鍵和值:

array_walk_recursive($array, function($v, $k) { 
           static $l = 0; 
           echo "Level " . $l++ . ": $k => $v\n"; 
          }); 

另一條顯示use與基準得到的結果:

array_walk_recursive($array, function($v) use(&$result) { 
           $result[] = $v; 
          }); 
相關問題