Foros del Web » Programando para Internet » PHP »

Categorías y Subcategorías en una única tabla

Estas en el tema de Categorías y Subcategorías en una única tabla en el foro de PHP en Foros del Web. A ver si pueden ayudarme. Intento armar un sistema de categorías y subcategorías infinitas en una única tabla, pero tengo alguna falla en la función ...
  #1 (permalink)  
Antiguo 24/07/2007, 00:50
Avatar de nachopro  
Fecha de Ingreso: noviembre-2003
Ubicación: Haedo, Bs. As.
Mensajes: 290
Antigüedad: 20 años, 5 meses
Puntos: 2
Categorías y Subcategorías en una única tabla

A ver si pueden ayudarme.

Intento armar un sistema de categorías y subcategorías infinitas en una
única tabla, pero tengo alguna falla en la función que arma el árbol de categorías.

La tabla que tengo es esta:

Shot at 2007-07-23

y el php para armar el árbol es el siguiente: (disculpen la desproligidad del código, pero pienso acomodarlo una vez que de con la función correcta):

Código PHP:
<?
mysql_connect
('localhost''root''');
mysql_select_db('test');

function 
hijos($id_padre)
{
    
$sql 'select * from categorias where id_padre = ('.$id_padre.')';
    
$rs mysql_query($sql);
    
$cantidad_hijos mysql_num_rows($rs);
    if (
$cantidad_hijos 0)
    {
        while (
$hijo mysql_fetch_assoc($rs))
        {
            
$hijos[$hijo['id']] = $hijo['nombre'];
        }
        return 
$hijos;
    }
    return 
false;
}

function 
mostrar_categoria($id_padre 0)
{
    
$rs mysql_query('select * from categorias where id_padre = ('.$id_padre.')');
    while (
$categoria mysql_fetch_assoc($rs))
    {
        echo 
$categoria['id'].' - '.$categoria['nombre'].'<br>';
        
$hijos hijos($categoria['id']);
        if (
$hijos)
        {
            foreach (
$hijos as $clave => $valor)
            {
                echo 
$clave.' - '.$valor.'<br>';
                
mostrar_categoria($clave);
            }
            
//echo 'tiene '.$hijos.' hijos';
        
}
        echo 
'<hr>';
    }
}

mostrar_categoria();

?>
Saludos
  #2 (permalink)  
Antiguo 24/07/2007, 06:00
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: Categorías y Subcategorías en una única tabla

Si entendí bien tu idea... no es mejor hacer una sola consulta a las dos tablas y cruzarlas?

Chaop!
__________________
Visita www.legionlandrover.com
  #3 (permalink)  
Antiguo 24/07/2007, 08:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Categorías y Subcategorías en una única tabla

Lo mejor es hacer un algoritmo recursivo, la idea es:

- Mientras el nodo actual tiene hijos, mostrar los hijos.

Ahora todo esto puede ser muy caro en cuanto a recursos, por eso lo mas recomendable es una vez que ya armaste tu arbol (1era pasada) lo guardes en un formato serializable para que ya no tengas que volver a hacer el calculo.

Saludos.
  #4 (permalink)  
Antiguo 24/07/2007, 10:22
Avatar de nachopro  
Fecha de Ingreso: noviembre-2003
Ubicación: Haedo, Bs. As.
Mensajes: 290
Antigüedad: 20 años, 5 meses
Puntos: 2
Re: Categorías y Subcategorías en una única tabla

GatorV, eso es más o menos lo que hace la función, pero en un punto falla al mostrar los resultados y no me doy cuenta por qué.
podrías asistirme?

pd: es buena tu idea, es decir....

Código:
mostrarÁrbol
{
	Si caché no existe
	{
		Armo árbol;
		Guardo árbol en caché;
	}

	return caché;
}
lo que habría que hacer, es que cada vez que desde el abm se modifique las categorías, borrar la caché para que se regenere el nuevo árbol :)
  #5 (permalink)  
Antiguo 24/07/2007, 10:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Categorías y Subcategorías en una única tabla

Asi es, y la mejor forma es guardar el cache en un campo de la base de datos, asi en tu ABM si agragas mandas llamar al metodo reconstruirArbol y ya vuelves a generar el cache.

Tu funcion no es recursiva ya que no checa si un nodo hijo es padre para volver a llamarse y obtener los hijos

Saludos.
  #6 (permalink)  
Antiguo 24/07/2007, 10:45
Avatar de nachopro  
Fecha de Ingreso: noviembre-2003
Ubicación: Haedo, Bs. As.
Mensajes: 290
Antigüedad: 20 años, 5 meses
Puntos: 2
Re: Categorías y Subcategorías en una única tabla

creo que no viste el código... hay una función que se llama hijos() y recibe por parámetro un Id para verificar si es padre de algún hijo :P

y en el caso de tener hijos, vuelve a llamarse a así mismo

y si no, cómo habría de ser (al menos los pasos lógicos)
  #7 (permalink)  
Antiguo 24/07/2007, 11:29
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años
Puntos: 60
Re: Categorías y Subcategorías en una única tabla

http://www.forosdelweb.com/showpost....&postcount=175

A mi me sirvio
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
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 16:24.