Foros del Web » Programando para Internet » PHP »

Recorrer Array Multidimensional

Estas en el tema de Recorrer Array Multidimensional en el foro de PHP en Foros del Web. Buenas foreros, Estoy haciendo una clase para crear formularios. La información para crear el formulario la guardo en un array. Ejemplo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: ...
  #1 (permalink)  
Antiguo 19/07/2015, 20:14
Avatar de LanbreGroteo  
Fecha de Ingreso: agosto-2009
Ubicación: $Mx->['Veracruz']
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 1
Pregunta Recorrer Array Multidimensional

Buenas foreros,

Estoy haciendo una clase para crear formularios. La información para crear el formulario la guardo en un array.

Ejemplo:
Código PHP:
Ver original
  1. $data = array(
  2.     'id' => 'ID',
  3.     'name' => 'form1',
  4.  
  5.     'secciones' => array(
  6.         'fieldset' => 'Datos personales',
  7.         'camposFieldset' => array(
  8.             'type' => 'text',
  9.             'hola' => 'HOLA',
  10.             ),
  11.         'fieldset' => 'Otro',
  12.         'camposFieldset' => array(
  13.             'type' => 'text',
  14.             'hola' => 'HOLA',
  15.             ),
  16.         ),
  17.     );

El problema es que no puedo recorrer el array en este punto -> $data['secciones']. El código que estoy utilizando es el siguiente:

Código PHP:
public function formulario ($data) {
        
$i 0
        while(
$i<count($k['secciones'])) {
            
            
$html .= '<fieldset>';
            
$html .= '<legend>'.$data['secciones'][$i]['fieldset'].'</legend>';
            
$html .= $this->generarCampos($data['secciones'][$i]['camposFieldset']);
            
$html .= '</fieldset>';
        }
        
        
$html .= $this->generarBotones($data['botones']);
        
        return 
'<form action="'.$data['accion'].'" name="'.$data['name'].'" id="'.$data['id'].'" method="'.$data['metodo'].'">'.$html.'</form>';
    } 
Intenté con while en ese ejemplo. También intenté con "for" de la siguiente forma:
Código PHP:
for($i=0;$i<count($data['secciones']); ++$i) {
 
//código aquí

¿Alguna sugerencia?
De antemano, muchas gracias por su tiempo.

¡Saludos!
__________________
Et credo in Serpentem, mysterium mysteriorum. In nomen eius Baphomet
  #2 (permalink)  
Antiguo 19/07/2015, 20:18
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Recorrer Array Multidimensional

Tus índices no son numéricos, son cadenas. Lo que te conviene usar es el constructor foreach.

Posdata: En los ejemplos del enlace que te dejé, también se muestran otras formas de usar la estructura while en combinación con algunas funciones de PHP para recorrer un array sin tener que usar un contador numérico.

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 19/07/2015, 20:23
Avatar de LanbreGroteo  
Fecha de Ingreso: agosto-2009
Ubicación: $Mx->['Veracruz']
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Recorrer Array Multidimensional

Cita:
Iniciado por Alexis88 Ver Mensaje
Tus índices no son numéricos, son cadenas. Lo que te conviene usar es el constructor foreach.

Saludos
¡Gracias, Alexis88!
La idea que tengo para hacerlo, sería indexar varios foreach en uno ¿o cómo le harías?

Código PHP:
foreach($data as $value) {
  foreach(
$value as $k as $v) {
}

__________________
Et credo in Serpentem, mysterium mysteriorum. In nomen eius Baphomet
  #4 (permalink)  
Antiguo 19/07/2015, 20:41
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Recorrer Array Multidimensional

Con esta estructura puedes imprimir todos los datos del array:

Código PHP:
Ver original
  1. foreach ($data as $index => $value){
  2.     if (is_array($value)){
  3.         foreach ($value as $ind => $val){
  4.             if (is_array($val)){
  5.                 foreach ($val as $i => $v){
  6.                     echo "$i : $v <br />";
  7.                 }
  8.             }
  9.             else{
  10.                 echo "$ind : $val <br />"; 
  11.             }
  12.         }
  13.     }
  14.     else{
  15.         echo "$index : $value <br />";
  16.     }
  17. }

El resultado, para el ejemplo, sería el siguiente:

Código HTML:
Ver original
  1. id : ID
  2. name : form1
  3. fieldset : Otro
  4. type : text
  5. hola : HOLA

Como verás, el value de cada bucle, viene siendo el array del siguiente, por lo que antes de imprimir un dato, compruebo si es un array para iterarlo o imprimirlo directamente si no lo es.

Trata de adaptar esto a lo que necesitas.

Saludos

EDITO: Hice una abstracción del algoritmo de arriba en una función recursiva para que funcione con cualquier cantidad de niveles en un array.

Código PHP:
Ver original
  1. function fn($arg){
  2.     foreach ($arg as $key => $val){
  3.         if (is_array($val)){
  4.             fn($val);
  5.         }
  6.         else{
  7.             echo "$key : $val\n";
  8.         }
  9.     }
  10. }
  11.  
  12. fn($data);

Imprime lo mismo.
__________________
«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

Última edición por Alexis88; 19/07/2015 a las 20:50 Razón: Abstracción
  #5 (permalink)  
Antiguo 19/07/2015, 20:55
Avatar de LanbreGroteo  
Fecha de Ingreso: agosto-2009
Ubicación: $Mx->['Veracruz']
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Recorrer Array Multidimensional

Cita:
Iniciado por Alexis88 Ver Mensaje

EDITO: Hice una abstracción del algoritmo de arriba en una función recursiva para que funcione con cualquier cantidad de niveles en un array.

Código PHP:
Ver original
  1. function fn($arg){
  2.     foreach ($arg as $key => $val){
  3.         if (is_array($val)){
  4.             fn($val);
  5.         }
  6.         else{
  7.             echo "$key : $val\n";
  8.         }
  9.     }
  10. }
  11.  
  12. fn($data);

Imprime lo mismo.
¡Muchísimas gracias, Alexis! Me funciona bien, el único problema es que sólo me devuelve un el último array dentro de 'secciones', el primero no me lo imprime.
__________________
Et credo in Serpentem, mysterium mysteriorum. In nomen eius Baphomet
  #6 (permalink)  
Antiguo 19/07/2015, 21:16
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Recorrer Array Multidimensional

Haciendo pruebas, he notado que se elimina los dos primeros índices y sus valores del array que contiene "secciones" pues se repiten con los dos siguientes. Probé colocando índices diferentes y todo va bien. No conocía este comportamiento en PHP, pero es lógico, es decir, es como si tuvieras más de una posición cero en un array; no tiene sentido.

Saludos

EDITO: Leyendo el manual, encontré esto:

Cita:
Iniciado por Manual de PHP
Si varios elementos en la declaración del array usan la misma clave, sólo la última será usada y los demás son sobrescritos.
Ahí la explicación.
__________________
«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
  #7 (permalink)  
Antiguo 19/07/2015, 21:33
Avatar de LanbreGroteo  
Fecha de Ingreso: agosto-2009
Ubicación: $Mx->['Veracruz']
Mensajes: 69
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Recorrer Array Multidimensional

Cita:
Iniciado por Alexis88 Ver Mensaje
Haciendo pruebas, he notado que se elimina los dos primeros índices y sus valores del array que contiene "secciones" pues se repiten con los dos siguientes. Probé colocando índices diferentes y todo va bien. No conocía este comportamiento en PHP, pero es lógico, es decir, es como si tuvieras más de una posición cero en un array; no tiene sentido.

Saludos

EDITO: Leyendo el manual, encontré esto:



Ahí la explicación.
O, vaya. Ahora entiendo porqué sólo se toman los valores del último array. ¿Será que en jSON se pueda hacer lo que tenía pensado y no importe si se repiten o no los índices?

Veré si puedo implementar lo mismo pero en jSON. ¡Muchisimas gracias por tu ayuda, Alexis88!
__________________
Et credo in Serpentem, mysterium mysteriorum. In nomen eius Baphomet

Etiquetas: formulario, html, multidimensional
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 04:31.