Foros del Web » Programando para Internet » PHP »

Cómo itarar sobre array

Estas en el tema de Cómo itarar sobre array en el foro de PHP en Foros del Web. Hola a todos. Estoy con una cosa me me trae de cabeza, que seguro que para vosotros es muy simple pero que a mí, un ...
  #1 (permalink)  
Antiguo 27/08/2015, 13:22
 
Fecha de Ingreso: junio-2012
Ubicación: Madrid
Mensajes: 339
Antigüedad: 11 años, 10 meses
Puntos: 47
Cómo itarar sobre array

Hola a todos. Estoy con una cosa me me trae de cabeza, que seguro que para vosotros es muy simple pero que a mí, un humilde casi profano en la materia, me está complicando la existencia. Os cuento.

Tengo una porción de una matriz que pertenece a un menú de Drupal (lo posteo aquí porque es PHP). Este menú me devuelve lo siguiente (la he simplificado muchísimo para postearla aquí):




Código PHP:
Ver original
  1.     (
  2.     [1077] => Array
  3.         (
  4.             [#theme] => menu_link__menu_equipos
  5.            [#attributes] => Array(... más...)
  6.            [#below] => Array
  7.                (
  8.                     [1078] => Array
  9.                         (
  10.                             [#theme] => menu_link__menu_equipos
  11.                             [#attributes] => Array(... más...)
  12.                             [#below] => Array
  13.                                (
  14.                                 )
  15.                         )
  16.  
  17.                     [1079] => Array
  18.                         (
  19.                             [#theme] => menu_link__equipos
  20.                             [#attributes] => Array(... más...)
  21.                             [#below] => Array
  22.                                (
  23.                                 )
  24.     [1081] => Array
  25.         (
  26.             [#theme] => menu_link__menu_equipos
  27.            [#attributes] => Array()
  28.            [#below] => Array
  29.                (
  30.                         )
  31.     [1088] => Array
  32.         (
  33.             [#theme] => menu_link__menu_equipos
  34.            [#attributes] => Array(.... más....)
  35.            [#below] => Array
  36.                (
  37.                         )
  38.  
  39.     [#contextual_links] => Array( ... más...);
  40.    [#theme_wrappers] => Array(... más...);
  41.    [#block] => Array(... más...);
  42.  
  43.     )

Como veis hay en el primer nivel (o como se diga) cinco claves con su correspondiente valor que son otros arrays. Estas son [1077] [1081] [1088] [#contextual_links] [#theme_wrappers] [#block].

Las que me interesan son las que son numéricas que son las que pertenecen a los elementos del menú, o sea [1077] [1081] [1088].

Estas a su vez contienen otro elemento con clave [#below] que en unos casos tienen a su vez otros elementos de menú (fijaos en la [1077]).


Pues bien, necesito iterar sobre estos arrays, de manera que si el array con clave x contiene dentro uno #below con elementos, itere de nuevo sobre estos, hasta llegar la nivel más bajo y ahí añadir unos atributos a uno concreto.

El código que he empezado a hacer es el siguiente:

Código PHP:

   
foreach($matrizMenu as $elemento => $contenidoElemento){
     
        if (isset(
$contenidoElemento['#below'])){

            foreach(
$contenidoElemento as $elemento2 => $contenidoElemento2){          
               echo 
$elemento2; echo "<br>";
            };

        };

     }; 
Com veis, lo que intento hacer es que si está declarada la variable #below, iteres sobre sus elementos (luego haré otro condicional que si tiene más de 1 elemento itere sobre estos, pero eso aquí de momento no lo pongo) .

El caso, que es me muestra los elementos perfectamente , pero me da el siguiente error sin llegar a cargar el resto de la página :

Código HTML:
[B]Fatal error:[/B] Cannot use object of type stdClass as array in /Trabajos/on-line/xxxxxx/sites/all/themes/xxxxxxx/templates/page.tpl.php on line 84
Si intento hacer un count de la siguiente manera, me muestra el mismo error:

Código PHP:
Ver original
  1. $countBelows = count($contenidoElemento['#below']);

¿Sabéis qué es lo qué estoy haciendo mal? o ¿se os ocurre una manera mejor de hacer esto?

Espero haberme explicado bien, y siento la extensión del mensaje, pero no podía hacerlo de una manera más breve.

un saludo y gracias de antemano.

Última edición por JustinKO; 27/08/2015 a las 13:28
  #2 (permalink)  
Antiguo 27/08/2015, 13:59
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: Cómo itarar sobre array

Para imprimir los valores de un array de varios niveles, podrías usar una función recursiva:

Código PHP:
Ver original
  1. function printArray($array){
  2.     foreach ($array as $key => $value){
  3.         if (is_array($value)){
  4.             printArray($value);
  5.         }
  6.         else{
  7.             echo "$key => $value <br />";
  8.         }
  9.     }
  10. }

De esta manera, se imprimirán todos los valores del array, incluidos los de los arrays que contenga, de los que estos puedan contener, así sucesivamente.

Ahora, ¿qué es lo que hay en la línea de código número 84 que es en donde se marca el error?

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 27/08/2015, 14:37
 
Fecha de Ingreso: junio-2012
Ubicación: Madrid
Mensajes: 339
Antigüedad: 11 años, 10 meses
Puntos: 47
Respuesta: Cómo itarar sobre array

Es cierto, se me pasó decir qué es lo que da el error. Es esta línea:
Código PHP:
Ver original
  1. if (isset($contenidoElemento['#below']))

Haré una prueba con lo que dices para entenderlo, De todos modos , no necesito imprimir los valores. Puse eso por poner algo y comprobar si me funcionaba el bucle. Dentro he de realizar otro tipo de operaciones mas complejas.
Lo que necesito en este paso es "detectar" qué array contiene la variable #below, y entonces iterar sobre sus elementos, de ahí el condicional que me da el error.

Muchas gracia por tu ayuda. Un saludo
  #4 (permalink)  
Antiguo 27/08/2015, 15:01
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: Cómo itarar sobre array

En ese caso, en lugar de imprimir el contenido de cada array, busca en ellos el índice en cuestión mediante la función array_key_exists.

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
  #5 (permalink)  
Antiguo 28/08/2015, 06:39
 
Fecha de Ingreso: junio-2012
Ubicación: Madrid
Mensajes: 339
Antigüedad: 11 años, 10 meses
Puntos: 47
Respuesta: Cómo iterar sobre array

Hola de nuevo, y muchísimas gracias por tu ayuda. He probado lo que me dices, y a partir de ahí he estado documentándome sobre más cosas en la web oficial de PHP. Pero sigo teniendo el mismo problema que son el isset().

Resumo de nuevo de una manera más simple lo que me pasa ver si sabéis por qué puede ser:

El array que he he posteado arriba, se lo asigno a la variable $matrizMenu, y realizo el siguiente script.

Código PHP:
Ver original
  1. // paso  $matrizMenu a un foreach para iterar por sus elementos
  2.    foreach($matrizMenu as $elemento => $contenidoElemento){
  3.  
  4.       // uso un condicional para comprobar si contiene el array con clave #below que son los que me interesan
  5.       if (array_key_exists('#below', $contenidoElemento['#below'])){
  6.  
  7.         // hago cualquier cosa
  8.  
  9.      };
  10.   };


Pues bien esto me da el siguiente error:

Código HTML:
Fatal error: Cannot use object of type stdClass as array in /Trabajos/on-line/xxxxx/sites/all/themes/xxxxxx/templates/page.tpl.php on line 86
en la línea 86 está el condicional con el array_key_exists.

De todos modos si hago un count($contenidoElemento['#below']) para comprobrar el número de elementos me da el mismo error. y si en vez de usar el array_key_exists, uso un isset, también me da el mismo error.

¿alguna idea de qué estoy haciendo mal?

Un saludo y gracias de nuevo.
  #6 (permalink)  
Antiguo 28/08/2015, 08:01
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Cómo itarar sobre array

Cannot use object of type stdClass as array

Php te esta intentando decir que no puedes recorrer un objeto stdClass como si fuera un arreglo, por que no es una arreglo. Por eso no te funciona lo que estas intentando hacer.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 28/08/2015, 10:38
 
Fecha de Ingreso: junio-2012
Ubicación: Madrid
Mensajes: 339
Antigüedad: 11 años, 10 meses
Puntos: 47
Respuesta: Cómo itarar sobre array

Hola hhs, Muchas gracias por tu respuesta.

¿entonces no hay manera de hacer lo que intento? llevo casi tres días con esto y he buscado en 1000 sitios, y no soy capaz.
Puedo modificar cosas dentro de la stdClass esa, crear nuevas propiedades, nuevos arrays, modificarlos, pasarlos con un foreach… solo me queda el poder comprobar si hay dentro una variable en concreto, con in isset o un array_key_exists o parecido (que me han enseñado aquí),y una vez conseguido esto podría hacer lo que busco.
¿no hay otra manera?

Disculpadme que insista, lo mismo estoy siendo un poco pesado, pero de verdad, cuando pregunto algo en el foro es porque he hecho lo posible por mi cuenta, y esto me ha superado. Si no tendré que buscar alguna solución alternativa.

Muchas gracias de nuevo. Yo no me doy por vencido, sigo buscando y probando mientras :)

Etiquetas: variable
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 01:32.