Ver Mensaje Individual
  #19 (permalink)  
Antiguo 11/07/2014, 14:37
ocp001a
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Menus de ilimitados subniveles

Suponiendo que tienes en la base de datos un menú así;

Código PHP:
Ver original
  1. $secciones=array(
  2.     array('id'=>1,'seccion'=>'Administracion','pertenece'=>0),
  3.     array('id'=>2,'seccion'=>'ventas','pertenece'=>1),
  4.     array('id'=>3,'seccion'=>'config','pertenece'=>2),
  5.     array('id'=>4,'seccion'=>'otro','pertenece'=>3),
  6.     array('id'=>5,'seccion'=>'mas','pertenece'=>4),
  7.     array('id'=>6,'seccion'=>'again','pertenece'=>5),
  8.     array('id'=>7,'seccion'=>'dos','pertenece'=>0),
  9.     array('id'=>8,'seccion'=>'tres','pertenece'=>0),
  10.     array('id'=>9,'seccion'=>'cuatro','pertenece'=>0),
  11.     array('id'=>10,'seccion'=>'cinco','pertenece'=>0),
  12.     array('id'=>11,'seccion'=>'nuevo','pertenece'=>3),
  13.     array('id'=>12,'seccion'=>'viejo','pertenece'=>3)
  14. );

Donde 'id' es el id del registro en la tabla, 'sección' es el nombre del menú o nivel, y 'pertenece' es el id del menú o submenú al que pertenece el registro actual (el id 1 sólo puede pertenecer al id 0)

Con una función similar a esta:

Código PHP:
Ver original
  1. function asigna($menu,$id,$seccion,$pertenece){
  2.     if(empty($menu))
  3.         return array('menu___id'=>$id,'menu_name'=>$seccion);
  4.     if(is_array($menu)){
  5.         if(isset($menu['menu___id']) and $menu['menu___id']==$pertenece)
  6.             $menu['Submenus'][]=array('menu___id'=>$id,'menu_name'=>$seccion);
  7.         else{
  8.             if(!isset($menu['Submenus']))
  9.                 $menu['Submenus']=array('menu___id'=>$id,'menu_name'=>$seccion);
  10.             else
  11.                 $menu['Submenus']=asigna($menu['Submenus'],$id,$seccion,$pertenece);
  12.         }
  13.     }
  14.     return $menu;
  15. }


Puedes crear el menú con la estructura que mencionas, recorriendo los registros de tu tabla (en este caso usé un arreglo y recorro con un for, pero se adaptaría a un while con una tabla)


Código PHP:
Ver original
  1. $menu=array();
  2. foreach($secciones as $i =>$m)
  3.     $menu=asigna($menu,$m['id'],$m['seccion'],$m['pertenece']);
  4. var_dump($menu);
  5. echo json_encode($menu);


Edito: por cierto, desde luego, este método carga todo el árbol del menú en memoria.