Recorrer array multidimensional recursivamente
A veces tenemos que tartar con arrays multidimensionales que son bastante complicados en su estructura, por lo que tenemos que empezar a escribir foreach’s anidados como locos, con la consecuencia inmediata de bajar la eficiencia de nuestros scripts y de disminuir la legibilidad de nuestro código.
Vamos a ver como mejorar estos inconvenientes usando una función recursiva.
Supongamos que tenemos el siguiente array:
<?php $frases[] = array('yahoo'=> array('title'=> array('count'=>1, 'text'=>"Yahoo!!") , '__total__'=>20)); $frases[] = array('google'=> array('title'=> array('count'=>21, 'text'=>"google!!") , '__total__'=>230)); $frases[] = array('msn'=> array('title'=> array('count'=>25, 'text'=>"msn!!") , '__total__'=>123, 'mas'=> array('elem1','elem2'))); $frases[] = array('elem3'); /* asi se ve la estructura del array Array ( [0] => Array ( [yahoo] => Array ( [title] => Array ( [count] => 1 [text] => Yahoo!! ) [__total__] => 20 ) ) [1] => Array ( [google] => Array ( [title] => Array ( [count] => 21 [text] => google!! ) [__total__] => 230 ) ) [2] => Array ( [msn] => Array ( [title] => Array ( [count] => 25 [text] => msn!! ) [__total__] => 123 [mas] => Array ( [0] => elem1 [1] => elem2 ) ) ) [3] => Array ( [0] => elem3 ) ) */ ?>
Como podemos ver es bastante complicado en su estructura, por lo que utilizar foreach anidados para recuperar los datos sería un dolor de cabeza; además, para diferentes estructuras deberíamos reescribir el código para recorrerla.
Veríamos algo como lo siguiente:
<?php foreach($frases as $frase_key => $frase_info){ foreach($frase_info as $tag_key => $tag_info){ foreach($tag_info as $data_key => $data_info){ ..... ..... ?>
La clave del asunto es ver este tipo de arrays como si fueran grafos (ver teoría de grafos) y de esta manera crear una función recursiva que use algún algoritmo conocido para recuperar los valores.
Veamos la función:
<?php function recorro($matriz){ foreach($matriz as $key=>$value){ if (is_array($value)){ //si es un array sigo recorriendo echo 'key:'. $key; echo '<br>'; recorro($value); }else{ //si es un elemento lo muestro echo $key.': '.$value ; echo '<br>'; } } } ?>
Esta función recorre el array completamente sin importar lo intrincado de su estructura, además, es muy eficiente y la lectura del código es muy simple, también es una solución genérica y reusable.



