Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] recorrer array multidimensional y mantener orden

Estas en el tema de recorrer array multidimensional y mantener orden en el foro de PHP en Foros del Web. Estimados amigos, Tengo un problema porque al recorrer un array multidimensional me cambia el orden respecto a lo que yo esperaba. Os explicaré el proceso ...
  #1 (permalink)  
Antiguo 01/03/2014, 02:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
recorrer array multidimensional y mantener orden

Estimados amigos,
Tengo un problema porque al recorrer un array multidimensional me cambia el orden respecto a lo que yo esperaba. Os explicaré el proceso que he seguido. Tras una consulta a mi base de datos me traigo los datos necesarios y los cargo en un array que recorro mediante una función recursiva para establecer la jerarquía de dependencia, mi principal objetivo. Esta primera parte parece funcionar bien:
Consulta

Código PHP:
Ver original
  1. $bigArray = array();
  2.  while ($rowhijos = mysqli_fetch_assoc($resulthijos))                      
  3.     {
  4.   $bigArray[] = $rowhijos;
  5.     }
  6.  
  7. /*función procedente de la red para establecer la jerarquía */
  8. function buildTree(array $elements, $parentId = 0) {
  9.     $branch = array();
  10.  
  11.     foreach ($elements as $element) {
  12.         if ($element['FKRefLema'] == $parentId) {
  13.             $children = buildTree($elements, $element['FKLema']);
  14.             if ($children) {
  15.                 $element['children'] = $children;
  16.             }
  17.             $branch[] = $element;
  18.         }
  19.     }
  20.  
  21.     return $branch;
  22. }
El resultado de mostrar el dato con print_r() es este, y aparentemente es lo que quiero, incluido el orden de aparación..

Array ( [0] => Array ( [FKLema] => 65 [lema] => αἰτέω [FKRefLema] => 23346 [FKStatus] => 5 ) [1] => Array ( [FKLema] => 66 [lema] => αἰτία [FKRefLema] => 23346 [FKStatus] => 5 [children] => Array ( [0] => Array ( [FKLema] => 68 [lema] => αἰτιάομαι [FKRefLema] => 66 [FKStatus] => 5 ) ) ) [2] => Array ( [FKLema] => 67 [lema] => αἴτιος [FKRefLema] => 23346 [FKStatus] => 5 ) )


Pero al tratar de recorrer ese array multidimensional mediante otra función, también tomada de la red, y mostrar los datos, el orden que sale no es el esperado

Código PHP:
Ver original
  1. function recorro($matriz){
  2.  $cadena='';
  3.     foreach($matriz as $key=>$value){
  4.         if (is_array($value)){  
  5.                         //si es un array sigo recorriendo
  6.             //echo 'key:'. $key;
  7.             //echo '<br>';
  8.             recorro($value);
  9.         }else{
  10.         $PKlema='';
  11.         $lema='';
  12.         $status='';
  13.        
  14.                //si es un elemento lo muestro
  15.                
  16.                if($key == 'FKLema') {$PKlema = $value;  $cadena.= '<a href="http://www.dicciogriego.es/index.php?op=1&PKLema='.$PKlema.'">';}
  17.                if($key == 'lema') {$lema = $value; $cadena.=$lema.'</a>, ';}
  18.                if($key == 'FKStatus') {$status = $value;}
  19.             //echo $key.': '.$value ;
  20.             //echo '<br>';
  21.         }
  22.  
  23.     }
  24. return $cadena;
  25. }

Al mostrar los datos se desordenan respecto a lo mostrado en el print_r() de la primera función jerárquica. Quiero mantener el orden que sale de esa función recursiva.
Código PHP:
Ver original
  1. echo '<br />';
  2. echo recorro($tree);
en lugar de
αἰτέω, αἰτιάομαι, αἰτία, αἴτιος,

debería de aparecer este otro
αἰτέω, αἰτία, αἰτιάομαι, αἴτιος

No sé si el fallo está en el modo de cargar el array desde la base, o en la función recursiva, aunque creo que no; me parece que está en la que recorre el resultado de la recursiva para mostrar los datos, pero no estoy seguro.

Agradeceré cualquier indicación o ayuda.

Última edición por jurena; 01/03/2014 a las 14:08
  #2 (permalink)  
Antiguo 02/03/2014, 02:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: recorrer array multidimensional y mantener orden

trataré de simplificar:
tengo este array
Array ( [0] => Array ( [FKLema] => 65 [lema] => αἰτέω [FKRefLema] => 23346 [FKStatus] => 5 ) [1] => Array ( [FKLema] => 66 [lema] => αἰτία [FKRefLema] => 23346 [FKStatus] => 5 [children] => Array ( [0] => Array ( [FKLema] => 68 [lema] => αἰτιάομαι [FKRefLema] => 66 [FKStatus] => 5 ) ) ) [2] => Array ( [FKLema] => 67 [lema] => αἴτιος [FKRefLema] => 23346 [FKStatus] => 5 ) )

y me gustaría poder obtener algo así
Array ( [0] => Array ( [FKLema] => 65 [lema] => αἰτέω [FKRefLema] => 23346 [FKStatus] => 5 ) [1] => Array ( [FKLema] => 66 [lema] => αἰτία [FKRefLema] => 23346 [FKStatus] => 5 ) [2] => Array ( [FKLema] => 68 [lema] => αἰτιάομαι [FKRefLema] => 66 [FKStatus] => 5 ) [3] => Array ( [FKLema] => 67 [lema] => αἴτιος [FKRefLema] => 23346 [FKStatus] => 5 ) )

la idea es poder mantener el mismo orden de aparición en el print_r. Me refiero a que primero cargue el padre y luego su hijo y luego el hijo de su hijo, para pasar posterioremente al siguiente padre, en un array de dos dimensiones.

Sería algo así como convertir en bidimensional un array multidimensional y que se conservara ese orden del print_r(). Pensé en serializar y luego cortar, pero imagino que habrá alguna solución recorriendo el array multidimensional y creando uno bidimensional en que los hijos y nietos del multidimensional pasen al primer nivel, al de padre, justo debajo en el orden, sin depender de él, como arrays distintos e independientes.

A ver si se os ocurre algo. He probado varias funciones de estas de flatten. Lo más que he conseguido es crear un array único con alguna función, pero en ese caso pierdo los nombres de las keys [FKLema], [lema], [FKstatus], y la distribución de la información y tendría que trabajar sobre los números de las nuevas claves para saber sobre qué información estoy.

Última edición por jurena; 03/03/2014 a las 10:35
  #3 (permalink)  
Antiguo 19/04/2014, 04:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: recorrer array multidimensional y mantener orden

amigos,
un amigo técnico que no pertenece al foro me ofreció la solución por correo privado y lo comparto con vosotros:
Código PHP:
Ver original
  1. function recurse_array($values){
  2.     $content ='';
  3.     foreach($values as $value){
  4.         //echo $value."<br>";
  5.         if( is_array($value) ){
  6.           //var_dump($value);echo"<br>";
  7.           if (key_exists('FKLema',$value))
  8.             $content .= '<a href="'.HOST.'/index.php?op=8&PKLema='.$value['FKLema'].'">'.$value['lema'].'</a>, ';
  9.           if (key_exists('children',$value))
  10.             $content .= recurse_array($value);
  11.         }
  12.     }
  13.     //echo "<br>salida recursiva:".$content ."<br>";
  14.     return $content;
  15.   }

la clave en la recursiva es usar esto: if (key_exists('children',$value)

Con eso se recorre el array multidimensional manteniendo el orden en que puede verse en el var_dump()

Última edición por jurena; 19/04/2014 a las 05:24

Etiquetas: configuración-php
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:14.