Foros del Web » Programando para Internet » PHP »

Una duda de lógica

Estas en el tema de Una duda de lógica en el foro de PHP en Foros del Web. Hola amigos, me acerco hoy con una duda que más que de PHP es de lógica, pero que aunque quizá sea un poco tonta no ...
  #1 (permalink)  
Antiguo 14/12/2009, 16:06
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 14 años, 7 meses
Puntos: 28
Una duda de lógica

Hola amigos, me acerco hoy con una duda que más que de PHP es de lógica, pero que aunque quizá sea un poco tonta no estoy sabiendo resolver.

Tengo una tabla (de categorías) donde cada categoría tiene una id, un id_padre y un nombre.
Ahora quiero listarlas, pero de forma que quede:

Madre 1
-Hija 1.1
-Hija 1.2
Madre 2
-Hija 2.1
-Hija 2.2
--SubHija 2.2.1
--SubHija 2.2.2
-Hija 2.3
Madre 3
-Hija 3.1
--SubHija 3.1.1


Se entiende?
De momento tengo algo así:

Código PHP:
$categoriasMadre mostrarCategorias(0); // me da un array con arrays dentro (1 por cada categoría madre)
foreach($categoriasMadre as $categoria){
  
// la muestro y llamo a:
  
$categoriasHija mostrarCategorias(); // me da un array con arrays dentro (1 por cada categoría)
  
foreach($categoriasHija as $categoriaHija){
    if(
$categoriaHija['id_padre'] == $categoria['id']){
      
// Muestro
    
}
  }

De esta manera muestro las madres y hijas (de primer nivel) correctamente, pero no logro hacer que esto sea válido para N niveles de "hijas"...

Espero se haya entendido la situación, agradezco cualquier idea que puedan darme
Saludos
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #2 (permalink)  
Antiguo 14/12/2009, 16:47
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Una duda de lógica

Hola Marcelo, para lograrlo debes crear una función basada en el concepto de recursividad. La función de esta función, valga la redundancia, será encontrar las hijas de la madre que se le pase como parámetro. La recursividad aquí está en que dentro de la función, al recorrer las hijas, harás un llamado a la misma función para cada una de las hijas, que en esa nueva instancia se comportarán como madres.

Es un problema muy común, y puede ser abordado de diversas maneras. El método que quieres emplear es el método tradicional, el que la mayoría usa. Sin embargo, no es la única opción. Te recomiendo leer este artículo, ya que allí explica como lograr lo que deseas. Adicionalmente dale una ojeada al segundo método. Aunque es un poco más dificil entenderlo, resulta más flexible y permite hacer varias cosas con una sola consulta, que de la forma tradicional requeriría varias consultas.

  #3 (permalink)  
Antiguo 14/12/2009, 16:55
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 14 años, 7 meses
Puntos: 28
Respuesta: Una duda de lógica

Excelente, muchas gracias por la explicación y la referencia al artículo...
Estoy leyendo y haré algunas pruebas

Luego les cuento
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #4 (permalink)  
Antiguo 14/12/2009, 17:16
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 14 años, 7 meses
Puntos: 28
Respuesta: Una duda de lógica

Perfecto :)
Me sirvió genial lo que me pasaste okram, muchas gracias!

He podido hacerlo funcionar correctamente y además aprendido (en la práctica) el uso de funciones recursivas :)


Saludos
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #5 (permalink)  
Antiguo 15/12/2009, 03:18
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Una duda de lógica

Claro, de más está decir que las funciones recursivas son un arma de doble filo. Si no tienes bien definido el flujo de tu función, si te equivocas por muy poco en el sitio donde colocas los elementos que integran la función, en fin, si no le prestas la debidad atención y cuidado, puedes terminar con un bucle infinito en el que la función se llama a así misma indefinidamente.

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 00:27.