Una posible mejora sería cargar todas las opciones en un array, esto permitiría:
1- Minimizar las consultas a la base de datos
2- Mostrar el menú cuantas veces sea necesario en la página
3- Mostrar sólo las opciones de un submenú
Ejemplo para armar el arreglo:
Código PHP:
Ver original// Cargamos opciones del menú
function cargaMenu($mysqli) {
// Falta una columna que permita seleccionar orden
// Ahora se muestran como fueron dados de alta
$sql = "SELECT * FROM menu";
$res = $mysqli->query($sql);
while($row = $res->fetch_assoc()) {
$id_padre = $row['id_padre'];
// Verificamos si existe el menú padre o lo creamos
(!isset($menu[$id_padre]) && $menu[$id_padre] = array()); // Agregamos ID del elemento actual al padre
$menu[$id_padre][] = $row['id'];
// Agregamos el elemento actual al arreglo 'todos'
$menu['todos'][$row['id']] = $row;
}
return $menu;
}
// Mostramos menú
function menu($id_padre, $menu) {
$html = "<ul>\n";
foreach($menu[$id_padre] as $id_menu) {
$html .= "<li><a href=\"pagina.php?opcion=$id_menu\">{$menu[$id_menu]['menu_nombre']}</a>";
// Este menú tiene hijos?
if(isset($menu[$id_menu])) { $html .= menu($id_menu, $menu);
}
$html .= "</li>\n";
}
$html .= "</ul>\n";
}
// Lo hacemos funcionar
$mysqli = con();
$menu = cargaMenu($mysqli);
// Mostramos menú, padre=0 para menú principal
echo menu(0, $menu);
// Podemos repetirlo en el pie de página, sin otras consultas a BDD
echo menu(0, $menu);
// O, si necesitamos sólo un submenú específico (productos)
echo menu(5, $menu);