Hago un pequeño aporte que quizas encuentren interesante.
El pequeño aporte que propongo, agrega la posibilidad de situar a cada elemento del menu en el orden que se quiera, pero lo mas interesante, es que sin hacer "nada raro" es la base de datos la que se encarga de hacer todo el trabajo.
La estructura de la tabla que usa,
la encontre originalmente aca y plantea una forma de ver a un menu de arbol de una manera diferente, ya no interesa de quien es hijo cada elemento, lo que importa es a quienes tiene de hermanos inmediatos, es decir, el nodo que tiene a su izquierda y el que tiene a su derecha.
Esta imagen extraida de la web antes mencionada, ilustra justamente eso:
La base de datos, tendria esta forma:
Código MySQL:
Ver original--
-- Base de datos: `test`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `nested_category`
--
--
-- Volcado de datos para la tabla `nested_category`
--
(1, 'ELECTRONICS', 1, 20),
(2, 'TELEVISIONS', 2, 9),
(3, 'TUBE', 3, 4),
(4, 'LCD', 5, 6),
(5, 'PLASMA', 7, 8),
(6, 'PORTABLE ELECTRONICS', 10, 19),
(7, 'MP3 PLAYERS', 11, 14),
(8, 'FLASH', 12, 13),
(9, 'CD PLAYERS', 15, 16),
(10, '2 WAY RADIOS', 17, 18);
Y el simple script php que arma el menu seria este:
Código PHP:
Ver original<?php
$mysqli = new mysqli("localhost", "root", "", "test");
$query = $mysqli->query("SELECT (COUNT(parent.name) - 1) level, node.name AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;");
$level = 0;
echo("<ul>");
while($option = $query->fetch_assoc())
{
echo("<li>$option[name]");
if($option["level"] != $level)
{
echo($option["level"] > $level ? "<ul>" : "</ul></li>");
$level = $option["level"];
}
else
echo("</li>");
}
echo("</ul>");
Lo interesante en este caso, es como mirando las cosas desde otro punto de vista se puede simplificar mucho las cosas, ¡¡incluso se puede crear un menu de ilimitados subniveles sin usar recursividad!! ¡¡y se pueden mostrar los elementos del menu directamente el buffer de salida apenas vuelven de la base de datos!! Eso significa que aunque nuestro menu tenga "infinitos" elementos, solo necesitamos memoria para almacenar uno de ellos, con lo cual se vuelve super liviano.
Por supuesto esto puede meterse dentro de una funcion sin problemas, es solo una idea de otra forma de implementarlo.