Foros del Web » Programando para Internet » PHP »

crear arbol genealógico con php

Estas en el tema de crear arbol genealógico con php en el foro de PHP en Foros del Web. Hola, estoy intentando crear un árbol genealógico usando php y mysql. Creo que lo mejor para explicar mi problema, es empezar exponiendo el planteamiento: la ...
  #1 (permalink)  
Antiguo 09/08/2011, 03:57
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
crear arbol genealógico con php

Hola,
estoy intentando crear un árbol genealógico usando php y mysql. Creo que lo mejor para explicar mi problema, es empezar exponiendo el planteamiento:

la base de datos que he creado es así:

id,
nombre,
ancestro

En el campo id, se introduce el valor numérico autoincrementado, en el campo nombre..., y el campo ancestro, se introduce el id del ancestro, es decir:

1, antonio, 0
|
|---> 2, pepito, 1
|---> 3, juan, 1

Donde pepito y juan son hijos de antonio...


A la hora de hacer la consulta a la base de datos, la hago así:


Código PHP:
$mysql->query("SELECT id, nombre, ancestro FROM genealogico WHERE ancestro = '".$_GET["ancestro"]."' ORDER BY nombre ASC"); 
Donde defino $_GET["ancestro"] por defecto a 0, y en la primera consulta, me saca los primeros de la lista, hasta ahora, el problema lo había solucionado de la siguiente forma:
Código PHP:
$consulta $mysql->query("SELECT id, nombre, ancestro FROM genealogico WHERE ancestro = '".$_GET["ancestro"]."' ORDER BY nombre ASC");
while(
$lista $mysql->f_obj($consulta)){[INDENT]print $lista->nombre;         
$subconsulta $mysql->query("SELECT id, nombre, ancestro FROM genealogico WHERE ancestro = '".$lista->id."' ORDER BY nombre ASC");
while(
$lista2 $mysql->f_obj($subconsulta)){
print 
$lista2->nombre;   
}[/
INDENT]} 
Así solucionaba el problema cuando tenía solo un subnivel. El tema es que necesito hacer consultas recurrentes, hasta llegar al último nivel, y quiero que sean automáticas en funcion del número de subniveles, y no se me ocurre como plantearla, ¿alguna idea?

Por si no queda claro del todo, quiero hacer algo así:


1, antonio, 0
|
|---> 2, pepito, 1
|---> 3, juan, 1
|
|-> 4, luis, 3
|
|-> 5, maria, 4

Un saludo
  #2 (permalink)  
Antiguo 09/08/2011, 04:03
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: crear arbol genealógico con php

Puedes usar una funcion recurrente :)

Algo así por ejemplo:
Código PHP:
function arbol($ancestro$nivel) {
$sql "SELECT * from `aqui` where `ancestro`=$ancestro";
$r mysql_query($sql);
while (
$arr mysql_fetch_array($r) ) {
    for(
$i=0$i$nivel$i++) echo '-'//Esto es para "identar" a los hijos!
    
echo $arr['nombre'].' ';
    
    
arbol($arr['id'], $nivel+1); //Esto mostrará los hijos!
}

Y la primera llamada sería algo así como
Código PHP:
arbol(0,0); 
PD: Suponiendo que el que no tiene "ancestro" es 0 :)

Más o menos, algo así podrías hacer :)
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 09/08/2011, 04:46
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: crear arbol genealógico con php

Gracias voy a probarlo... lo que veo es que tengo que añadir el campo nivel a la bd, ya que de momento no contaba con ello

Última edición por dadam; 09/08/2011 a las 05:05
  #4 (permalink)  
Antiguo 09/08/2011, 05:18
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: crear arbol genealógico con php

No, no haría falta. Al pasarlo como parámetro (0 en un estado inicial), cuando vuelve a llamar a la funcion (para buscar los hijos) lo pasa como 1. Después, en cada hijo cuando busque los respectivos hijos lo pasará como 2 (pq serán hijos de hijos), etc :)
__________________
>> Eleazan's Source
>> @Eleazan
  #5 (permalink)  
Antiguo 09/08/2011, 08:05
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: crear arbol genealógico con php

Tu método tiene un fallo, y es que el for siempre es 0, si empiezas en el nivel 0, y no muestra nada, al final basándome en tu sistema, he utilizado esta funcion:

Código PHP:
function listParent($mysql$previus$table$parent){
    
$sql $mysql->query("SELECT * FROM ".$table." WHERE previus = '".$previus."'");
    while(
$result $mysql->f_obj($sql)){
        print 
$parent.$result->name;
        
$parent .= $result->name." --> ";
        
listParent($mysql$result->id$table$parent);
        
$parent NULL;
    }

Muchas gracias por la ayuda!
  #6 (permalink)  
Antiguo 10/08/2011, 01:44
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: crear arbol genealógico con php

Si te ha servido, perfecto :)

Yo lo que quería era mostrarte la idea (de hecho, no suelo probar el código!), asiq da igual que mi código no sea 100% correcto o funcional :)

Un saludo!
__________________
>> Eleazan's Source
>> @Eleazan
  #7 (permalink)  
Antiguo 10/08/2011, 03:55
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: crear arbol genealógico con php

Por si a alguien le sirve, he depurado un poco más el sistema y funciona perfectamente para categorias infinitas...

Código PHP:
class categories{
    
    var 
$table        ""
    var 
$id            "";
    var 
$name        "";
    var 
$previus        "";
    
    
//Listamos las categorias raiz
    
function parentCategories($mysql){
        
$sqlCategory =  $mysql->query("SELECT ".$this->id.", ".$this->name." FROM ".$this->table." WHERE ".$this->previus." = '0' ORDER BY name ASC");
        while(
$category $mysql->f_obj($sqlCategory)){
            print 
"<div>".$category->name."</div>";    
            
$this->childrenCategories($mysql$category->id,  $category->name." -> ");
        }        
        
$mysql->free_sql($sqlCategory);
    }
    
    
//Comprobamos si tienen subcategorias
    
function childrenCategories($mysql$prer$parent){
        
$sqlCategory =  $mysql->query("SELECT ".$this->id.", ".$this->name." FROM ".$this->table." WHERE ".$this->previus." = '".$pre."' ORDER BY name ASC");
        while(
$category $mysql->f_obj($sqlCategory)){
            print 
"<div>".$parent.$category->name."</div>";
            
$parent .= $category->name." -> ";
            
$this->childrenCategories($mysql$category->id$parent);        
        }
        
$mysql->free_sql($sqlCategory);
    }

Matizo, que la conexion a mysql la hago desde una clase, que eso se puede cambiar...
  #8 (permalink)  
Antiguo 10/08/2011, 05:17
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: crear arbol genealógico con php

Que tal dadam,

Hay varias formas de lidiar con las estructuras de árbol, te sugiero que investigues un poco mas las otras opciones que tienes(referencia), recursividad contra la bbdd debería ser tu último recurso, es mas para tu caso en concreto con una sola query y sin recursividad puedes lograr lo mismo http://jdbartlett.com/2008/01/15/tre...cy-list-model/

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 10/08/2011, 09:53
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: crear arbol genealógico con php

Muchas gracias por el aviso, realmente me han parecido muy interesantes los artículos, y me he decantado por hacer la recurrencia en el array y no en la base de datos, ha quedado asi:

Código PHP:
class listCategories{

    var 
$childrenCategory     "";
    var 
$table                 "";
        
    function 
main($mysql){
        
$sql $mysql->query("SELECT id, name, previus FROM ".$this->table." ORDER BY name ASC");
        while(
$result $mysql->f_obj($sql)){
            
$list[] = array($result->id$result->name$result->previus);
        }
        foreach(
$list as $field){
            if(
$field[2] == 0){
                print 
"<div>".$field[1]."</div>";    
                
$this->childrenCategory[$field[1]] = $this->children($list$field[0], $field[1]);
            }
        }
    }
    function 
children($list$previus$previusName){
        foreach(
$list as $value){
            if(
$value[2] == $previus){
                
$this->childrenCategory .= " ".$value[1];
                print 
"<div>".$previusName.$this->childrenCategory."</div>";
                
$this->children($list$value[0], $value[1]);
            }
        }
    }

Funciona exactamente igual, y efectivamente, solo hace una consulta a la bd.

Gracias!
  #10 (permalink)  
Antiguo 15/08/2011, 07:57
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: crear arbol genealógico con php

Hola otra vez, sigo con el mismo problema, esta vez se trata de crear una ruta de las categorias, por ejemplo:

Antonio > Fernando > Amalia

En este caso, no tengo más remedio que hacer consultas recursivas a la BD, y lo hago de la siguiente forma:

Código PHP:
function createPath($mysql$category$_tableCat$path ""){
    
$result $mysql->query("SELECT id, name, previus FROM $_tableCat WHERE id = '{$category}' LIMIT 1");
    
$row $mysql->f_obj($result);
    if(
$row->previus 0){
        
$path[] .= $row->id .","$row->name;
        
$category $row->previus
        if(
$category 0){
            
createPath($mysql$category$_tableCat$path);
        }
    }
    return 
$path;

Lo que hago es ver el id actual, y voy buscando el previo (previus), hasta que llego a 0, el problema es que no funciona, el array ($path) se vacia en cada pasada, y me devuelve siempre el último resultado... seguro que es una tontería pero no veo donde está el problema, es como si cada vez que llama la función la variable $path se reiniciara, en vez de pasar los datos acumulados

Un saludo! y a ver si alguien me puede ayudar.
  #11 (permalink)  
Antiguo 15/08/2011, 08:10
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: crear arbol genealógico con php

En uno de los links que te deje, este exactamente http://www.sitepoint.com/hierarchical-data-database/, hay una sección que se llama The Path to a Node, ahi te muestra que debes hacer(merge de la llamada recursiva + el path actual)

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #12 (permalink)  
Antiguo 15/08/2011, 08:30
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 19
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: crear arbol genealógico con php

Muchisimas gracias otra vez!! me centré en el otro artículo sin consultas recurrentes y no miré este con demasiada profundidad.

Lo dicho, gracias y perdona por preguntar dos veces lo mismo.
  #13 (permalink)  
Antiguo 22/09/2012, 15:44
 
Fecha de Ingreso: septiembre-2012
Mensajes: 1
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta Respuesta: crear arbol genealógico con php

necesito que por favor me envien toda la ayuda posible, es decir el codigo de la base de datos y los archivos php para resolver la forma de crear un arbol geneaologico en php y mysql, lo necesito urgente.,

gracias

Etiquetas: mysql, arboles
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 03:21.