Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Foreach sobre array multidimensional no muestra toda la info

Estas en el tema de Foreach sobre array multidimensional no muestra toda la info en el foro de PHP en Foros del Web. Hola! Estoy jugando con foreach sobre un array multidimensional. El foreach muestra en pantalla los nombres de las claves de 1er y 2do nivel, pero ...
  #1 (permalink)  
Antiguo 31/05/2015, 19:01
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Foreach sobre array multidimensional no muestra toda la info

Hola!

Estoy jugando con foreach sobre un array multidimensional. El foreach muestra en pantalla los nombres de las claves de 1er y 2do nivel, pero ya no los valores de 3er nivel:

Código PHP:
$miArray = array(
    
"Enero"=> [
        
"Lunes"=> [
            
"Hora"=> [
                
"Minuto"=> [
                    
"1"=> "uno",
                    
"2"=> "dos",
                    
"3"=> "tres",
                ]
            ],
        ],
    ],
    
"Febrero"=> [
        
"Martes"=> [
            
"Hora"=> [
                
"Minuto"=> [
                    
"4"=> "cuatro",
                    
"5"=> "cinco",
                    
"6"=> "seis",
                ]
            ],
        ],
    ]
);

foreach( 
$miArray as $clave1=>$valorClave1 ) {
    
print_r("Nivel 1: ".$clave1);
    echo 
"<br>";

    foreach( 
$miArray[$clave1] as $clave2=>$valorClave2 ) {
        
print_r("Nivel 2: ".$clave2);
        echo 
"<br>";

        foreach( 
$miArray[$clave2] as $clave3=>$valorClave3 ) {
            
print_r("Nivel 3: ".$clave3);
            echo 
"<br>";
        }
    }

En pantalla se devuelven los errores: Undefined index: Lunes y Undefined index: Martes .
Y que hay un Invalid argument supplied for foreach() en el último foreach.

Es decir, claro que está leyendo los índices LUNES y MARTES, evidentemente, como que me está dando sus nombres. ¿Pero por qué dice que no?

Saludos!
  #2 (permalink)  
Antiguo 31/05/2015, 19:52
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Foreach sobre array multidimensional no muestra toda la info

Te falta el índice $clave1 en el tercer bucle ya que no puedes saltarte el primer nivel.

Código PHP:
Ver original
  1. //Tercer bucle
  2. foreach ($miArray[$clave1][$clave2] as $clave3=>$valorClave3){
  3.     //Do stuff
  4. }

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 31/05/2015, 19:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Foreach sobre array multidimensional no muestra toda la info

El problema es que en cada nivel lees siempre $miArray pero eso ya no tiene sentido.

En el momento en que iteras el primer array debes comenzar a leer $valorClave1, después $valorClave2 y así sucesivamente.

Básicamente tu error es siempre leer el primer array de origen pensando en que así lees los demás sub-niveles.

Piensa bien lo que haces y verás.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 31/05/2015, 20:06
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Foreach sobre array multidimensional no muestra toda la info

Cita:
Iniciado por Alexis88 Ver Mensaje
Te falta el índice $clave1 en el tercer bucle ya que no puedes saltarte el primer nivel...

Qué desgraciada pena!

Ya habíamos tenido este problema pero en Javascript con un for in, por aquí. Antes de postear aquí, le eché un vistazo, que evidentemente no fue suficiente. Tengo que poner más atención, .

Maestro, muchas gracias y hasta pronto!
  #5 (permalink)  
Antiguo 31/05/2015, 20:16
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Foreach sobre array multidimensional no muestra toda la info

Cita:
Iniciado por pateketrueke Ver Mensaje
...En el momento en que iteras el primer array debes comenzar a leer $valorClave1, después $valorClave2 y así sucesivamente...
Maestro pateketrueke, hice el cambio así:
Código PHP:
foreach( $miArray as $clave1=>$valorClave1 ) {
    
print_r("Nivel 1: ".$clave1);
    echo 
"<br>";

    foreach( 
$valorClave1 as $clave2=>$valorClave2 ) {
        
print_r("Nivel 2: ".$clave2);
        echo 
"<br>";

        foreach( 
$valorClave2 as $clave3=>$valorClave3 ) {
            
print_r("Nivel 3: ".$clave3);
            echo 
"<br>";

            foreach( 
$valorClave3 as $clave4=>$valorClave4 ) {
                
print_r("Nivel 4: ".$clave4);
                echo 
"<br>";
    
                foreach( 
$valorClave4 as $clave5=>$valorClave5 ) {
                    
print_r("Nivel 5: ".$clave5);
                    echo 
"<br>";
                }
            }
        }
    }

¿Esto significa que consume menos recursos?

Saludos!
  #6 (permalink)  
Antiguo 31/05/2015, 20:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Foreach sobre array multidimensional no muestra toda la info

Más que consumir recursos, creo que es lo que por lógica debes de hacer cuando usas un foreach. Todo está en saber usar el par clave => valor. La otra forma está bien para un for en donde los índices tiene que ir indicados en cada iteración.

Por cierto, en ese caso del for...in, la solución era justo como la que necesitabas acá usando los índices.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:10.