Ver Mensaje Individual
  #6 (permalink)  
Antiguo 08/08/2014, 03:22
Avatar de fbedia
fbedia
 
Fecha de Ingreso: julio-2010
Mensajes: 159
Antigüedad: 13 años, 10 meses
Puntos: 8
Respuesta: Categorias, Subcategorias y Recursividad

Gracias a todos!
He tratado de hacer lo que comentado por Triby.
A continuacion los resultados:

En primer lugar la tabla mysql con datos de prueba con la que he trabajado:

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `categorias_noticias` (
  2.   `id_categoria` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `id_cat_principal` INT(11) NOT NULL,
  4.   `nombre` VARCHAR(25) NOT NULL,
  5.   `rango_minimo` INT(11) NOT NULL,
  6.   `visible` tinyint(1) NOT NULL,
  7.   PRIMARY KEY (`id_categoria`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
  9.  
  10. --
  11. -- Volcado de datos para la tabla `categorias_noticias`
  12. --
  13.  
  14. INSERT INTO `categorias_noticias` (`id_categoria`, `id_cat_principal`, `nombre`, `rango_minimo`, `visible`) VALUES
  15. (1, 0, 'Deportes', 1, 1),
  16. (2, 0, 'Sociedad', 1, 1),
  17. (3, 2, 'Economia', 1, 1),
  18. (4, 2, 'Religion', 1, 1),
  19. (5, 1, 'Tierra', 1, 1),
  20. (6, 1, 'Mar', 1, 1),
  21. (7, 5, 'Futbol', 1, 1),
  22. (8, 5, 'Tenis', 1, 1),
  23. (9, 7, 'Futbol 7', 1, 1),
  24. (10, 7, 'Futbol 11', 1, 1);

Con el siguiente codigo, si no me equivoco, creo el array comentado por Triby:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $link_db = mysqli_connect('localhost', 'root', '', 'proyecto12');
  4. mysqli_set_charset($link_db, "utf8");
  5.  
  6. $q = mysqli_query($link_db,"SELECT id_categoria, id_cat_principal, nombre
  7.         FROM categorias_noticias
  8.         ORDER BY id_categoria");
  9.  
  10. $indice=0;
  11.  
  12. while($row=mysqli_fetch_array($q)) {
  13.  
  14.         $todos[$indice]=array(
  15.                             "id_categoria"=>$row[0],
  16.                             "id_cat_principal"=>$row[1],
  17.                             "nombre"=>$row[2],
  18.                         );
  19.         $indice++;
  20.        
  21.  
  22. }
  23.  
  24.  
  25. var_dump($todos);
  26.  
  27. ?>

El resultado de var_dump es el siguiente:

Cita:
array(8) {
[0]=> array(3) {
["id_categoria"]=> string(1) "1" ["id_cat_principal"]=> string(1) "0" ["nombre"]=> string(8) "Deportes"
}
[1]=> array(3) {
["id_categoria"]=> string(1) "2" ["id_cat_principal"]=> string(1) "0" ["nombre"]=> string(8) "Sociedad"
}
[2]=> array(3) {
["id_categoria"]=> string(1) "3" ["id_cat_principal"]=> string(1) "2" ["nombre"]=> string(8) "Economia"
}
[3]=> array(3) {
["id_categoria"]=> string(1) "4" ["id_cat_principal"]=> string(1) "2" ["nombre"]=> string(8) "Religion"
}
[4]=> array(3) {
["id_categoria"]=> string(1) "5" ["id_cat_principal"]=> string(1) "1" ["nombre"]=> string(6) "Tierra"
}
[5]=> array(3) {
["id_categoria"]=> string(1) "6" ["id_cat_principal"]=> string(1) "1" ["nombre"]=> string(3) "Mar"
}
[6]=> array(3) {
["id_categoria"]=> string(1) "7" ["id_cat_principal"]=> string(1) "5" ["nombre"]=> string(6) "Futbol"
}
[7]=> array(3) {
["id_categoria"]=> string(1) "8" ["id_cat_principal"]=> string(1) "5" ["nombre"]=> string(5) "Tenis"
}
[8]=> array(3) {
["id_categoria"]=> string(1) "9" ["id_cat_principal"]=> string(1) "7" ["nombre"]=> string(8) "Futbol 7"
}
[9]=> array(3) {
["id_categoria"]=> string(2) "10" ["id_cat_principal"]=> string(1) "7" ["nombre"]=> string(9) "Futbol 11"
}
}
Asta aqui creo que mas o menos voy bien no?

Ahora mi mayor problema es que no se bien como interactuar con el array anterior...
Por ejemplo: ¿Como hago para pintar unicamente los registros con id_cat_padre=0?

------------

De "chiripa" he conseguido mostrar el menú ordenado como quiero... sin embargo, aparte de que creo que no es muy eficiente... no es un metodo que me convezca, porque por decirlo de alguna forma, nunca se "en que parte o bub-nivel" estoy. Es decir, si quiero pintarlo con etiquetas <ul><li></li><li><ul>.....</ul></li></ul>....etc... no sabria con el siguiente codigo como hacerlo:

Código PHP:
Ver original
  1. <?php
  2. echo mostrar(0);
  3. //var_dump($todos);
  4.  
  5. //echo $todos[0]['nombre'];
  6.  
  7. function mostrar($actual=0) {
  8.  
  9.     $link_db = mysqli_connect('localhost', 'root', '', 'proyecto12');
  10.     mysqli_set_charset($link_db, "utf8");
  11.  
  12.     $q = mysqli_query($link_db,"SELECT id_categoria, id_cat_principal, nombre
  13.         FROM categorias_noticias
  14.         ORDER BY id_categoria");
  15.  
  16.     $indice=0;
  17.  
  18.     while($row=mysqli_fetch_array($q)) {
  19.  
  20.         $todos[$indice]=array(
  21.                             "id_categoria"=>$row[0],
  22.                             "id_cat_principal"=>$row[1],
  23.                             "nombre"=>$row[2],
  24.                         );
  25.         $indice++;
  26.        
  27.  
  28.     }
  29.  
  30.     foreach($todos as $valor) {
  31.        
  32.         if($valor['id_cat_principal']==$actual) {
  33.             echo $valor['nombre']."<br/>";
  34.             echo mostrar($valor['id_categoria']);
  35.         }
  36.     }
  37. }
  38. ?>

El codigo anterior me devuelve las categorias y subcategorias ordenadas (algo es algo):

Cita:
Deportes
Tierra
Futbol
Futbol 7
Futbol 11
Tenis
Mar
Sociedad
Economia
Religion
__________________
Follow me on twitter @franbedia