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.





esta funcion es increible. muchas gracias!
Excelente, gracias
Hola, una pregunta (Lo busque por toda la web), ¿Qué significa el operador “=>”?
Gracias y salu2.
Hola Gonzalo, el operador “=>” sirve para diferenciar la clave y el valor de un elemento de una array. Por ejemplo, al crear un array puedo hacerlo indicando cuales serán sus claves y valores:
Además, lo puedes usar en la sentencia “foreach” con el mismo propósito:
Ejemplo completo:
Salida:
Muchas gracias y más por esos buenos ejemplos…Hacía bastante tenía la duda y Google no sirve para buscar símbolos.
Fantástico, gracias
Muy buena funcion! me gusta
Que grande amigo, sos un groxo…!!! me solucionaste un problemon no me podia ir sin comentar….!!!! saludos
BUEN DIA CHICOS , NECESITO REALIZAR UN EJERCIO, DE LIQUIDACION DE SUELDOS.
TENGO EL SIGUIENTE CODIGO
Liquidacion de sueldos
Emplados
Horas
Sueldos
<?php
// creamos los array correspondientes para empleados
$empleados = array (
array('Mendez','150','1500'),
array('Gomez','190','1900'),
array('Ramirez','250','2500'),
array('Martinez','300','3000'),
);
foreach ($empleados as $empleado) {
foreach ($empleado as $campo)
echo "$campo””;
echo ”;
}
?>
LA PREGUNTA ES ALGUIEN ME PUEDE AYUDAR, POR QUE NO ME QUEDA BIEN, LA IDEA ES HACER UNA TABLA QUE TENGA NOMBRE-HORAS-SUELDOS Y ABAJO DE TODO LOS TOTALES , CUALQUIER AYUDA SIRVE MUCHO ,., GRACIASSSSSSSSSSSSS
Bueno veamos si esto te sirve: