2012-06-07 20 views
8

Finora, se devo scorrere un array multidimensionale, utilizzo un ciclo foreach per ogni dimensione.Esiste un modo per scorrere un array multidimensionale senza conoscere la sua profondità?

per esempio per due dimensioni

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

Cosa faccio quando non so la profondità della matrice? cioè la profondità è variabile.

L'unica cosa che posso pensare è codificare un'intera pila di loop e interrompere il ciclo se il valore successivo non è un array. Sembra un po 'sciocco.

C'è un modo migliore?

risposta

16

Sì, è possibile utilizzare recursion. Ecco un esempio in cui è uscita di tutti gli elementi di un array:

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); 

ciò che si dovrebbe sempre ricordare quando fare la ricorsione è che avete bisogno di un caso di base dove non andare più in profondità.

Mi piace verificare il caso base prima di continuare la funzione. È un linguaggio comune, ma non è strettamente necessario. Puoi anche controllare il ciclo foreach se dovessi eseguire l'output o effettuare una chiamata ricorsiva, ma spesso trovo che il codice sia più difficile da mantenere in questo modo.

La "distanza" tra l'input corrente e il caso base è detta variante ed è un numero intero. La variante dovrebbe essere strettamente decrescente in ogni chiamata ricorsiva. La variante nell'esempio precedente è the depth of $a. Se non pensi alla variante rischi di finire con ricorsioni infinite e alla fine lo script morirà a causa di uno stack overflow. Non è raro documentare esattamente quale sia la variante in un commento prima delle funzioni ricorsive.

+1

N. Uso comando incorporato array_walk_recursive(). PHP fa schifo alla ricorsione. –

0

È possibile utilizzare la ricorsione per questo problema:

Ecco un esempio

$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); 
    } 
} 

Userà la ricorsione per scorrere gamma

verrà stampata come

a 
b 
c 
final value 
0

funzione semplice all'interno array_walk_recursive per mostrare il livello di annidamento e le chiavi e valori:

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

Un'altra mostrando use con un riferimento per ottenere un risultato:

array_walk_recursive($array, function($v) use(&$result) { 
           $result[] = $v; 
          }); 
Problemi correlati