Tema: FAQ's de PHP
Ver Mensaje Individual
  #146 (permalink)  
Antiguo 19/10/2005, 14:27
Avatar de Vaalegk
Vaalegk
 
Fecha de Ingreso: abril-2005
Mensajes: 154
Antigüedad: 19 años
Puntos: 2
Tema: Recursividad/Arboles
Pregunta: Como crear un arbol jerarquico a partir de una tabla en la DB
Respuesta:

Este metodo funciona para tablas con referencias a ellas mismas,como por ejemplo en un sistema que se desee mantener relaciones padre hijo sin usar tablas intermedias

Ejemplo de estructura (sin ninguna DB en mente):

Tabla:
catetoria
--cat_id //indice
--parent_id //indice al id del padre (en este caso una referencia a cat_id)
--nombre
--...mas campos

Cabe destacar que con esta estructura se restringe a un solo padre por elemento, los nodos padre o raiz tendran su campo "parent_id" en 0.

ahora bien para construir/imprimir un arbol con esos datos, la manera mas facil es utilizar una funcion recursiva asi:

Código PHP:
/*
funcion generica
Parametros:
    $tabla     = Nombre de la tabla en la DB
    $id_field  = Nombre del campo llave de la tabla
    $show_data = Campo a mostrar en el arbol
    $link_field= Campo que establece la relacion padre hijo
    $parent       = padre actual
    $prefix    = string con un campo a mostrar en cada entrada del arbol
*/
function crearArbol($tabla,$id_field,$show_data,$link_field,$parent,$prefix){
    
/*Armar query*/
    
$sql='select * from '.$tabla.' where '.$link_field.'='.$parant;

    
/*Asumiendo que se usa MySQL (se puede cambiar facilmente a otra db)*/

    
$rs=@mysql_query($sql);
    if(
$rs){
           
/*Recorrer todos las entradas */
           
while($arr=mysql_fetch_array($rs)){
        
/* Imprimir campo a mostrar*/
                
echo($prefix.$arr[$show_data].'<br>');
        
        
/* imprimir arbol the "hijos" de este elemento*/
                
crearArbol($tabla,$id_field,$show_data,
                               
$link_field,$arr[$id_field],$prefix.$prefix);
           }
    }    


Código PHP:
/*
ahora, asumiendo que se tiene una tabla con una estructura
como la mencionada anteriormente se utilizaria asi:
*/

crearArbol('categoria','cat_id','nombre','parent_id',0,'-'); 

/*
  lo cual tendra un output algo asi (dependiendo de los datos):

 -categoria1
 --categoria2
 -categoria3
 --categoria4
 ----categoria5 

*/ 
Ahora, Como y porque funciona?:

Dadas las condiciones de la estructura de datos, donde el padre siempre es "0" para los elementos raiz, al llamar la funcion el query devuelve todos los elementos raiz en su primera llamada, al recorrer cada elemento, la funcion es llamada para imprimir todos los elementos hijos de este elemento, y asi "recursivamente" hasta terminar con
todos los elementos.

trabajare en otra funcion para un escenario de muchos a muchos padre<->hijos, lo cual seria bastante parecido


Saludos,