Foros del Web » Programando para Internet » PHP »

Elementos dependientes

Estas en el tema de Elementos dependientes en el foro de PHP en Foros del Web. Hola a todos! Tengo un problema que, dados mis escasos conocimientos de PHP, se me está haciendo muy muy grande. Resulta que tengo una clasificación ...
  #1 (permalink)  
Antiguo 11/12/2004, 09:58
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 16 años
Puntos: 60
Elementos dependientes

Hola a todos!

Tengo un problema que, dados mis escasos conocimientos de PHP, se me está haciendo muy muy grande.

Resulta que tengo una clasificación por categorías en una base de datos (MySQL por si sirve). La estructura es como una tienda online, donde hay categorías, subcategorías... el caso es que cada categoría es una fila en mi base de datos.En esta fila, entre otros valores que no vienen al caso, hay un campo id (con un número único de cada fila ¿se llama key?) y otro campo llamado "pende". En el campo pende pongo el id de la categoría de la que pende.

Por ejemplo, en una supuesta estructura tal que:

ropa (id=1)
|
+-camisas (id=2)
|
+- pantalones (id=3)
| |
| +Pantalones cortos (id=4)
|
...

Tengo puesto en mi base de datos:
Código HTML:
ID    nombre             pende
1     ropa               0 (porque no pende de nada, es raiz)
2     camisas            1 (porque pende de ropa)

3     pantalones         1 (porque pende de ropa)
4     Pantalones Cortos  3 (porque pende de pantalones)
Espero que se me haya entendido.

Entonces, yo ahora quiero hacer una estructura de árbol (algo similar al combo de estos foros donde aparece estructurado todo el árbol de foros del site. No sé si lo habeis visto, está abajo del todo. Podeis verlo ahora si bajais abajo del todo) con la estructura de los productos de la supuesta tienda.

Pero no sé cómo hacerlo. Creo que podría meter en un array todos los registros de la tabla y luego por medio de array_keys sacar las que penden de un id

algo así:

$penden_de_ropa=array_keys($registros['penden'],1);

(porque 1 es el id de ropa)

luego ya con el array de $penden_de_ropa ya tengo todos los registros que penden para hacer la estructura...

Mi pregunta es, ¿cómo puedo meter todos los registros en un array o cómo se os ocurre para hacer lo que digo sin ponerme a hacer consultas a diestro y siniestro en la base de datos?

Espero no haber sido muy obtuso en la explicación, ni muy pesado, ni enfarragoso y que tenga fácil solución....

Espero vuestras respuestas (sólo se aceptarán insultos si se fundamentan debidamente).
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.

Última edición por KarlanKas; 11/12/2004 a las 10:03
  #2 (permalink)  
Antiguo 13/12/2004, 06:29
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 16 años
Puntos: 60
Le sigo dando vueltas. Si hago la consulta en MySQL ordenándolo por pende obtengo una lista ordenada, pero no estructurada... No se me ocurre que hacer que no sean multiples consultas...

A alguien se le ocurre?
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #3 (permalink)  
Antiguo 13/12/2004, 08:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Creo que este tutorial te ayudará:
http://www.sitepoint.com/article/hie...-data-database

Muestra várias alternativas para gestionar información de forma "jerarquica" en tus BD (mysql) con ejemplos de implementación en PHP.


Un saludo,
  #4 (permalink)  
Antiguo 13/12/2004, 09:21
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 16 años
Puntos: 60
Muchas gracias, Cluster!!

más de 20.301 veces salvador!!

Voy a visitar el enlace!!
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #5 (permalink)  
Antiguo 13/12/2004, 09:27
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 16 años
Puntos: 60
Es alucinante!!

Primero veo que mi forma de ordenarlo no es tan descabellada, y segundo: es genial como, oh gran Cluster, encuentras una información tan precisa respecto a mi problema, cualquiera diría que Gijs Van Tulder pensara (en alemán) "Voy a ver si ayudo a KarlanKas en el problemita que tiene...".

Con respetuoso afecto,
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #6 (permalink)  
Antiguo 13/12/2004, 14:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno .. espero que te sirva .. por qué todo eso de nodos y demás jeje no es mi fuerte xDDD.

Si lo resuelves no te olvides de colocar por aquí el código y de paso nos das una explicación.

Un saludo,
  #7 (permalink)  
Antiguo 13/12/2004, 17:57
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 16 años
Puntos: 60
Pues la verdad es que me ha servido! No he entrado aún a mirar lo de los nodos, pero para ver si era lo que quería he hecho unas pruebas y ha funcionado!!

He modificado un poco el código que proponían porque yo tengo un campo con el id y otro con el nombre y el alemán este tan simpático sólo tenía el campo del nombre. Y la función ha quedado así:

Código PHP:
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
//        used to display a nice indented tree

function display_children($parent$level) {
   
// retrieve all children of $parent
   
$result mysql_query('SELECT * FROM categorias '.
                          
'WHERE pende="'.$parent.'";');

   
// display each child
   
while ($row mysql_fetch_array($result)) {
       
// indent and display the title of this child

//Aquí hice otro cambio porque quería que mostrara un combo con las opciones

       
echo "<option value='".$row['id']."'>".str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;',$level).$row['nombre']."</option>\n";

       
// call this function again to display this
       // child's children
       
display_children($row['id'], $level+1);
   }

Básicamente lo que hace es lo que no quería hacer (jeje). Hace varias consultas: va id por ide viendo los que dependen de él y los va poniendo debajo. Es muy ingenioso en su forma! Se basa en que ninguna subcategoría va a tener un id anterior a la categoría que lo envuelve (como es lógico ya que para meter una cosa dentro de otra debes hacer antes el continente que el contenido).

Y luego en el código de la página pongo:
Código PHP:
<select name="categoria">
<option>Seleccione la categoría</option>
<?echo "<select name='categoria'>";
display_children('',0);
?>
</select>
En cuanto mire lo de los nodos os comento
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 07:36.