Ver Mensaje Individual
  #3 (permalink)  
Antiguo 07/08/2014, 11:58
Avatar de Triby
Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 9 meses
Puntos: 2237
Respuesta: Categorias, Subcategorias y Recursividad

Normalmente yo hago una sola consulta, leyendo todas las categorías y cargándolas en un array.

Todo en pseudo-código.

Según tu ejemplo (suponiendo las ID):
Código:
- 1 - DEPORTES
-- 2 - TIERRA
--- 3 - FUTBOL
---- 4 - FUTBOL BASE
---- 5 - FUTBITO
---- 6 - FUTBOL PROFESIONAL
--- 7 - SKY
--- 8 - TENIS
-- 9 - MAR
---- 10 - REMO
La idea es crear un array con un elemento 'todos' que contendrá la información de cada categoría/subcategoría y un elemento para cada categoría que tenga hijos:

Código:
todos => array(
     // ID         ID, Nombre, Padre
      1 => array(1, DEPORTES, 0)
      2 => array(2, TIERRA, 1)
      3 => array(3, FUTBOL, 2)
      4 => array(4, FUTBOL BASE, 3)
      5 => array(5, FUTBITO, 3)
      6 => array(6, FUTBOL PROFESIONAL, 3)
      7 => array(7, SKY, 2)
      8 => array(8, TENIS, 2)
      9 => array(9, MAR, 1)
      10 => array(10, REMO, 9)
)
// Como categoría padre solo está deportes
0 => array(1)
// Deportes tiene 2 hijos: TIERRA y MAR
1 => array(2, 9)
// Tierra tiene 3 hijos: FUTBOL, SKY y TENIS
2 => array(3, 7, 8)
// Futbol tiene 3 hijos
3 => array(4, 5, 6)
// Mar tiene un hijo
9 => array(10)
Después de cargarlas todas, puedes hacer una función (recursiva o no, según necesites) para mostrar todo:

Código:
funcion verCategorias(padre = 0) {
      foreach(categorias[padre] as id) {
            print categorias['todos'][id]['nombre']
            // Revisar si la categoría tiene hijos
            if(isset(categorias[id])) {
                     verCategorias(id)
            }
      }
}
La ventaja de hacerlo así es que economizas recursos al reducir la cantidad de consultas y, además, puedes crear un archivo de caché para agilizar aún más el proceso.
__________________
- León, Guanajuato
- GV-Foto