Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/08/2015, 13:22
JustinKO
 
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