Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/10/2014, 15:06
mikehove
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Sumar nodos en función recursiva PHP - Menú - Categorías

Primero que todo quiero disculparme con Uds. por el tiempo y algún conflicto que haya generado y darles mis sinceras gracias por responderme.

*Con la guía de Triby (es muy probable que yo lo haya colocado en el lugar incorrecto):
Código PHP:
Ver original
  1. $html .= '<li><a href="pagina.php?opcion='.$id_menu.'">'.$menu['todos'][$id_menu]['productos_nombre'];
  2.     if(isset($menu[$id_padre])) {
  3.           $numero = count($menu[$id_padre]);
  4.           $html .="(".$numero.")";                
  5.     }        
  6. $html .='</a>';
Arroja en pantalla:


*Con tu ayuda Quimfv (también imprime en pantalla el mismo resultado que Triby):
Código PHP:
Ver original
  1. $html .= '<li><a href="pagina.php?opcion='.$id_menu.'">'.$menu['todos'][$id_menu]['productos_nombre'];
  2. $html .=" ( ".count($menu[$id_padre])." )";
  3. $html .='</a>';
Agregando el "print_r":
Código HTML:
Ver original
  1. Array
  2. (
  3.     [todos] => Array
  4.         (
  5.             [1] => Array
  6.                 (
  7.                     [productos_id] => 1
  8.                     [productos_parent_id] => 0
  9.                     [productos_nombre] => Inicio
  10.                 )
  11.  
  12.             [2] => Array
  13.                 (
  14.                     [productos_id] => 2
  15.                     [productos_parent_id] => 1
  16.                     [productos_nombre] => Categoria1
  17.                 )
  18.  
  19.             [3] => Array
  20.                 (
  21.                     [productos_id] => 3
  22.                     [productos_parent_id] => 1
  23.                     [productos_nombre] => Categoria2
  24.                 )
  25.  
  26.             [4] => Array
  27.                 (
  28.                     [productos_id] => 4
  29.                     [productos_parent_id] => 1
  30.                     [productos_nombre] => Categoria3
  31.                 )
  32.  
  33.             [5] => Array
  34.                 (
  35.                     [productos_id] => 5
  36.                     [productos_parent_id] => 2
  37.                     [productos_nombre] => Categoria1_Subcategoria1
  38.                 )
  39.  
  40.             [6] => Array
  41.                 (
  42.                     [productos_id] => 6
  43.                     [productos_parent_id] => 4
  44.                     [productos_nombre] => Categoria3_Subcategoria1
  45.                 )
  46.  
  47.             [7] => Array
  48.                 (
  49.                     [productos_id] => 7
  50.                     [productos_parent_id] => 4
  51.                     [productos_nombre] => Categoria3_Subcategoria2
  52.                 )
  53.  
  54.         )
  55.  
  56.     [0] => Array
  57.         (
  58.             [0] => 1
  59.         )
  60.  
  61.     [1] => Array
  62.         (
  63.             [0] => 2
  64.             [1] => 3
  65.             [2] => 4
  66.         )
  67.  
  68.     [2] => Array
  69.         (
  70.             [0] => 5
  71.         )
  72.  
  73.     [4] => Array
  74.         (
  75.             [0] => 6
  76.             [1] => 7
  77.         )
  78.  
  79. )

Otros datos de la idea:

Página completa con su conexión a la BBDD:
Código PHP:
Ver original
  1. <?php  
  2.     function crearConexion(){
  3.         //Datos para la conexión con el servidor
  4.         $servidor   = "localhost";
  5.         $nombreBD   = "base2";
  6.         $usuario    = "root";
  7.         $contrasena = "";
  8.         //Creando la conexión, nuevo objeto mysqli
  9.         $conexion = new mysqli($servidor,$usuario,$contrasena,$nombreBD);
  10.         //Si sucede algún error la función muere e imprimir el error
  11.         if($conexion->connect_error){
  12.             die("Error en la conexion : ".$conexion->connect_errno.
  13.                                       "-".$conexion->connect_error);
  14.         }
  15.         //Si nada sucede retornamos la conexión
  16.         return $conexion;
  17.     }
  18.        
  19.        // Cargamos opciones del menú
  20. function cargaMenu($mysqli) {
  21.     $menu = array('todos' => array());
  22.     // Falta una columna que permita seleccionar orden
  23.     // Ahora se muestran como fueron dados de alta 
  24.  
  25.     $sql = "SELECT * FROM productos";
  26.     $res = $mysqli->query($sql);
  27.     while($row = $res->fetch_assoc()) {
  28.         $id_padre = $row['productos_parent_id'];
  29.         // Verificamos si existe el menú padre o lo creamos
  30.         (!isset($menu[$id_padre]) && $menu[$id_padre] = array());
  31.         // Agregamos ID del elemento actual al padre
  32.         $menu[$id_padre][] = $row['productos_id'];
  33.         // Agregamos el elemento actual al arreglo 'todos'
  34.         $menu['todos'][$row['productos_id']] = $row;
  35.     }
  36.     return $menu;
  37. }
  38.  
  39. // Mostramos menú
  40. function menu($id_padre, $hijos, $menu) {
  41.     $html = "<ul>\n";
  42.       foreach($menu[$id_padre] as $id_menu) {  
  43.           $html .= '<li><a href="pagina.php?opcion='.$id_menu.'">'.$menu['todos'][$id_menu]['productos_nombre'];
  44.           $html .=" ( ".count($menu[$id_padre])." )";    
  45.           $html .='</a>';
  46.          // Este menú tiene hijos?
  47.          if(isset($menu[$id_menu])) {      
  48.             //Si quiero ver los hijos
  49.             if($hijos=="ver_hijos") {                
  50.               $html .= menu($id_menu, $hijos, $menu );
  51.             }
  52.             //o no verlos  
  53.             if($hijos=="ocultar_hijos "){                  
  54.             }          
  55.          }       
  56.          $html .= "</li>\n";
  57.     }
  58.     $html .= "</ul>\n";
  59.     // Devuelve el valor
  60.     return $html;  
  61. }
  62. // Lo hacemos funcionar
  63. $mysqli = crearConexion();
  64. $menu = cargaMenu($mysqli);
  65.    
  66. // Mostramos menú, padre=0 para menú principal
  67. echo menu(1,  "ver_hijos", $menu);
  68. echo "<pre>";
  69. print_r($menu);
  70. echo "</pre>";
  71.      
  72. ?>

Estructura de la tabla:

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `productos` (
  2.   `productos_id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `productos_parent_id` INT(11) NOT NULL,
  4.   `productos_nombre` VARCHAR(30) COLLATE utf8_spanish_ci DEFAULT NULL,
  5.   PRIMARY KEY (`productos_id`)
  6. )
  7. INSERT INTO `productos` (`productos_id`, `productos_parent_id`, `productos_nombre`) VALUES
  8. (1, 0, 'Inicio'),
  9. (2, 1, 'Categoria1'),
  10. (3, 1, 'Categoria2'),
  11. (4, 1, 'Categoria3'),
  12. (5, 2, 'Categoria1_Subcategoria1'),
  13. (6, 4, 'Categoria3_Subcategoria1'),
  14. (7, 4, 'Categoria3_Subcategoria2');

Más gráficamente esta es la idea que muestre la suma de los hijos:



Ojalá me puedan dar otro empujón, amigos! Por favor