Foros del Web » Programando para Internet » PHP »

Crear lista ul-li desde cualquier nodo

Estas en el tema de Crear lista ul-li desde cualquier nodo en el foro de PHP en Foros del Web. Hola amigos, Tengo una estructura de "padres e hijos", es decir, un grafo con nodos. Me gustaría saber cómo construir una lista ul-li (es decir ...
  #1 (permalink)  
Antiguo 04/08/2015, 09:59
 
Fecha de Ingreso: septiembre-2003
Mensajes: 337
Antigüedad: 20 años, 7 meses
Puntos: 4
Crear lista ul-li desde cualquier nodo

Hola amigos,

Tengo una estructura de "padres e hijos", es decir, un grafo con nodos. Me gustaría saber cómo construir una lista ul-li (es decir HTML) con los datos que recojo de la base de datos, dado un id que será un nodo cualquiera del grafo.

A ver si me explico...

Tengo algo así:

Código:
1
|---2
     |--------3
|---4
     |--------5
     |--------6
                |------------7
                |------------8
     |--------9
Es decir, el 1 es el padre del nodo 2 y del 4.
El nodo 2 tiene un hijo, el 3
El nodo 4 tiene tres hijos, el 5, el 6 y el 9
Y por último en el nivel más bajo, el 6 tiene los hijos 7 y 8.

Mediante PHP me gustaría poder montar una estructura HTML con <ul> y <li> dado cualquier ID del grafo. Es decir, si por ejemplo tengo el ID 6, quiero sacar sus "padres" y todos sus hijos y nietos (si los tiene). El grafo resultante debería ser así:

Código:
1
|---4
     |--------6
                |------------7
                |------------8
Para entendernos, el grafo hacia arriba es una línea recta (podría decirse) y hacia abajo, solo los sucesores directos (lo dicho: hijos y nietos, no "sobrinos").

En HTML el resultado debería ser una cosa así:

Código HTML:
<ul>
  <li>
    1
    <ul>
      <li>
        4
        <ul>
          <li>
            6
            <ul>
              <li>
                7
              </li>
              <li>
                8
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul> 
Si tuviera el ID 4 como parámetro, el grafo resultante para cotruir el HTML sería este:

Código:
1
|---4
     |--------5
     |--------6
                |------------7
                |------------8
     |--------9
Con los datos que tengo en mi BD, puedo sacar quiénes son los padres y los hijos así que ese no es problema. El problema que tengo es cómo construir la estructura, que me está volviendo loco.

Muchísimas gracias de antemano, espero haber explicado bien todo.

PD: El objetivo de montar esta estructura es para poder montar un organigrama con el plugin de JQuery JOrgChart
  #2 (permalink)  
Antiguo 04/08/2015, 10:13
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Crear lista ul-li desde cualquier nodo

Si la estructura son listas anidadas una función recursiva debería resolverlo fácilmente.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 05/08/2015, 00:17
 
Fecha de Ingreso: septiembre-2003
Mensajes: 337
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Crear lista ul-li desde cualquier nodo

Gracias por la respuesta, es lo que imaginaba y lo intenté, pero ¿cómo ir montando la estructura de <ul> y <li>? eso me está volviendo un poco loco :(
  #4 (permalink)  
Antiguo 05/08/2015, 02:46
 
Fecha de Ingreso: septiembre-2003
Mensajes: 337
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Crear lista ul-li desde cualquier nodo

Parece que lo he conseguido, con el siguiente código. Yo diría que me está funcionando correctamente...

Código PHP:
<?php
$padre 
"1";
echo 
"<ul><li>".$padre;
hijos($padre$padre);
echo 
"</ul>";

function 
hijos($id$padre) {
    
    
$reg consulta('idHijo'TABLA"idPadre='$id'"'''''idHijo');
    
    if (
count($reg)>0){ echo "<ul>"; }
    
    for (
$i=0$i count($reg); $i++) {
        
        if (
$padre!=$reg[$i]['idHijo']){
    
            if (!
esPadre($reg[$i]['idHijo'])){
    
                echo 
"<li>".$reg[$i]['idHijo']."</li>";
                if (
$i==count($reg)-1){ echo "</ul>"; }
    
            }else{
    
                echo 
$reg[$i]['idHijo'];
                
hijos($reg[$i]['idHijo'], $padre);
    
            }
    
        }
    
    }

}

?>
Esto lo he hecho partiendo desde el nodo "padre absoluto". Ahora tengo que buscar la forma de que la construcción de la estructura se pueda hacer a partir de cualquier nodo, de forma que primero tengo que sacar todos sus "padres" hasta llegar al "padre absoluto" y a partir de ahí, usar lo que he puesto arriba.

Seguiré peleando pues.

Gracias de antemano.
  #5 (permalink)  
Antiguo 05/08/2015, 09:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Crear lista ul-li desde cualquier nodo

El asunto es que no debes forzar las etiquetas <ul><li> con lógica fuera de la función, la única cosa que es consistente es que una lista de elementos siempre regresará la misma estructura.

Código PHP:
Ver original
  1. function re($list) {
  2.   $html = [];
  3.  
  4.   // apretura, siempre
  5.   $html []= '<ul>';
  6.  
  7.   // items
  8.   foreach ($list as $item) {
  9.     // lógica para recursividad (lista anidada)
  10.     if (is_array($item)) {
  11.       $html []= '<li>' . re($item) . '</li>';
  12.     } else {
  13.       // sólo un item más
  14.       $html []= '<li>' . $item . '</li>';
  15.     }
  16.   }
  17.  
  18.   // cierre, siempre
  19.   $html []= '</ul>';
  20.  
  21.   // es mejor un return que un echo
  22.   return join("\n", $html);
  23. }
  24.  
  25. echo re([1, 2, [5, 6, [7, 8]], 3, 4]);
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 06/08/2015, 00:52
 
Fecha de Ingreso: septiembre-2003
Mensajes: 337
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Crear lista ul-li desde cualquier nodo

Muchas gracias por la respuesta pateketrueke.

Tu idea me funciona, pero claro, el problema que tengo es generar la lista con la que se hace la llamada inicial, eso me está volviendo un poco loco.

Además tengo que poder crear el árbol desde cualquier nodo. Con lo que puse yo o bien con tu solución, el árbol "hacia abajo" se contruye perfectamente. Pero ¿y si quiero construir el árbol desde un nodo concreto que puede encontrarse en mitad del árbol?

Desde ese nodo hacia abajo, no hay problema porque esas son nuestras soluciones. Pero hacia arriba tendría que obtener también sus ascendientes "directos" (padres, abuelos, bisabuelos... hasta llegar a la raíz), no sus "hermanos" o tíos"

Etiquetas: html, lista, nodo
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 20:20.