Escrito por el 17 mar, 2009 en Lenguaje PHP | 10 comentarios

Comparte este artículo!

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.


VN:F [1.9.22_1171]
Te gusto este post?
Rating: 9.6/10 (18 votes cast)
Recorrer array multidimensional recursivamente, 9.6 out of 10 based on 18 ratings
Comparte este artículo!

10 Comentarios

  1. 8-31-2011

    esta funcion es increible. muchas gracias!

  2. 2-14-2012

    Excelente, gracias

  3. 2-14-2012

    Hola, una pregunta (Lo busque por toda la web), ¿Qué significa el operador “=>”?
    Gracias y salu2.

  4. 2-16-2012

    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:

    $coleccion = array(clave1 => valor1, clave2 => valor2);

    Además, lo puedes usar en la sentencia “foreach” con el mismo propósito:

    foreach($coleccion as $clave => $valor){
           //para cada elemento del array tendremos en la variable $clave su clave
           //y enla variable $valor el valor del elemento
    }

    Ejemplo completo:

    $frutas = array('rojo' => 'manzana', 'amarillo' => 'banana', 'violeta' => 'uva');
    foreach($frutas as $clave => $valor){
           echo "La fruta de color ".$clave." es la ".$valor."";
    }

    Salida:

    La fruta de color rojo es la manzana
    La fruta de color amarillo es la banana
    La fruta de color violeta es la uva
  5. 2-17-2012

    Muchas gracias y más por esos buenos ejemplos…Hacía bastante tenía la duda y Google no sirve para buscar símbolos.

  6. 9-13-2012

    Fantástico, gracias

  7. 10-19-2012

    Muy buena funcion! me gusta ;)

  8. 1-21-2013

    Que grande amigo, sos un groxo…!!! me solucionaste un problemon no me podia ir sin comentar….!!!! saludos

  9. 2-17-2013

    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

  10. 2-18-2013

    Bueno veamos si esto te sirve:

     
    $empleados = array (
    	array('Mendez','150','1500'),
    	array('Gomez','190','1900'),
    	array('Ramirez','250','2500'),
    	array('Martinez','300','3000'),
    );
     
    echo "<table>";
    foreach ($empleados as $empleado) {
    	echo "<tr>";
    	foreach ($empleado as $key=>$campo){
     
    		echo "<td>".$campo."</td>";
     
    		switch($key){
    		   case 1:
    			// sumo las horas
    			$horas_totales += $campo;
    			break;
    		   case 2:
    			// sumo los sueldos
    			$sueldos_totales += $campo;
    			break;
    		}
    	}
    	echo "</tr>";
    }
    echo "<tr><td>Totales</td><td>".$horas_totales." </td><td>".$sueldos_totales." </td></tr>";
    echo "</table>";

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Security Code: