Foros del Web » Programando para Internet » PHP »

Crear arbol con diferentes niveles...

Estas en el tema de Crear arbol con diferentes niveles... en el foro de PHP en Foros del Web. Saludos amigos, Llevo días con un problemilla tratando de crear un organigrama de manera dinámica, leyendo la información de MySQL y creando con PHP las ...
  #1 (permalink)  
Antiguo 10/11/2009, 11:43
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 5 meses
Puntos: 0
Crear arbol con diferentes niveles...

Saludos amigos,

Llevo días con un problemilla tratando de crear un organigrama de manera dinámica, leyendo la información de MySQL y creando con PHP las jerarquías.

La estructura del organigrama debe ser parecida a:
Código PHP:
Direccion General
Dirección Comercial
      
|---> Ventas
      
|---> Marketing
Dirección Finanzas
      
|---> Contabilidad
      
|---> Crédito
Recursos Humanos
Dirección Operaciones
      
|---> Centros
               
|---> Almacen
               
|---> Contabilidad
               
|---> Pedadogía
                        
|---> Supervisores
                        
|---> Profesores
               
|---> Recepción
      
|---> Logistica
Dirección IT 
Si se fijan hay un nivel 0, pero puede haber hasta N niveles indentados.

La información que recibo desde MySQL en la variable $result viene de la siguiente forma:
Código:
mysql> SELECT id, position, parentid FROM Jobs;
+---+----------------------+----------+
| id | position            | parentid |
+---+----------------------+----------+
|  1 | Direcion General    | Null     |
|  2 | Dirección Comercial | Null     |
|  3 | Ventas              |  2       |
|  4 | Marketing           |  2       |
|  5 | Dirección Finanzas  | Null     |
...
...
Y el echo debe imprimir una cadena con la siguiente estructura:
Código:
[
  {id:1, position:"Dirección General", leaf:true},
  {id:2, position:"Dirección Comercial", children:[
    {id:3, position:"Ventas", leaf:true},
    {id:4, position:"Marketing", leaf:true}
  ]},
  {id:5, position:"Dirección Finanzas", children:[
    ...
  ]}
  ...
]
El siguiente código me funciona solo cuando hay nivel 0 y nivel 1, pero cuando existen más niveles me da error al no cerrar correctamente el children del nivel anterior al actual.
Código PHP:
$dptos = new Department();
$result $dptos->getDptosByCompany($cookie->idcompany);
if (
$result) {
     
$str '[';
     for (
$i=0$i<sizeof($result); $i++) {
          
$str .= '{id:'.$result[$i]['id'];
          
$str .= ', position:"'.$result[$i]['position'].'"';
          if (
$result[$i]['id'] == $result[$i+1]['parentid'])
               
$str .= ', children:[';
          else
               
$str .= ($result[$i]['parentid'] != $result[$i+1]['parentid']) ? ', leaf:true}]},' ', leaf:true},';  
     }
     echo 
rtrim($str,',').']';
} else
     echo 
false
Alguna sugerencia????
Saludos,

Silver
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #2 (permalink)  
Antiguo 10/11/2009, 11:50
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Crear arbol con diferentes niveles...

Probablemente resultará más práctico guardar los datos en un array con la respectiva relación de jerarquía y luego al final usar json_encode para formatear la salida.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 10/11/2009, 13:15
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 5 meses
Puntos: 0
Respuesta: Crear arbol con diferentes niveles...

Gracias David,

Si, se pudiera meter todo a un array, pero el problema sigue estando en el "argoritmo" para crear esa estructura indentada.

Para más claridad podemos obviar "children" y "leaf" y todo eso que parece en mi código... sólo necesito un código que imprima lo siguiente:
Código:
node 1
node 2
   node 3
   node 4
node 5
   node 6
      node 7
         node 8
node 9
Alguna sugerencia??
Saludos,

Silver
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #4 (permalink)  
Antiguo 10/11/2009, 19:28
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 5 meses
Puntos: 0
Respuesta: Crear arbol con diferentes niveles...

Resuelto!

Hay que cambiar el segundo IF que está en el código por:
Código PHP:
if ($result[$i]['id'] == $result[$i+1]['parentid'])
    
$str .= ', children:[';
else {
    
$str .= ', leaf:true}';
    
$tmp = ($i==$i-1);
    
// cuando hay varios records al mismo nivel me muevo al primero
    
while ($i != $tmp && $result[$tmp]['parentid'] == $result[$i]['parentid']) { 
        
$tmp--; 
    }
    
// cierro los "children" abiertos
    
while ($result[$tmp]['parentid'] != $result[$i+1]['parentid']) {
        
$str .= ']}';
        
$tmp--;
    } 
    
$str .= ',';

Quizas haya que depurarlo un poco, pero al menos funciona ;)

Saludos y gracias,
Silver
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
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 13:14.