Menu de récurrence hiérarchique avec PHP / MySQL
Question
Cela devrait (espérons-le) être une question assez facile à répondre pour certains d'entre vous.
J'ai un menu récursif fonctionnel dans une base de données mySQL. Mon problème principal est le suivant:
Quel est le meilleur moyen de créer l'URL? Je préférerais que le titre de chaque rangée soit / oeufs / lait / bacon /. Les œufs étant de niveau 0 comme: œufs-0, lait-1, bacon-2. Des idées sur la façon de générer dynamiquement ceci?
Je vais à peu près chercher ce que "cletus" dit quelques commentaires sur cette question: PHP / MySQL - Création d'une hiérarchie de menus de navigation
Mais j'ai besoin d'un peu plus d'explications sur la façon de le faire.
La solution
Sauf si vous envisagez de modifier souvent votre arborescence de menus, pré-stocker l'URL hiérarchique requise pour chaque élément de menu est probablement le plus simple (pour la résolution au moment de l'exécution).
Si vous vous attendez à ce que l'arbre soit modifié assez souvent, disons - via une interface Web, il serait alors plus facile de générer les chemins chaque fois que vous lisez le menu, quelque chose comme ceci:
id | name | parent
----+--------+-------
0 | eggs | NULL
1 | milk | 0
2 | bacon | 1
3 | tomato | 0
4 | lettuce| 1
foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
$menuitem = array_merge(array(), $row);
$menuLookup[$menuitem['id']] &= $menuitem;
if ($menuitem['parent'] == null) {
$menuitem['path'] = "/" . $menuitem['name'];
$menu[] &= $menuitem[];
} else {
$parent &= $menuLookup[$menuitem['parent']];
$menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
$parent['menu'][] &= $menuitem;
}
}
Je n'ai pas débogué ce code, je l'ai seulement testé pour son exactitude; -)
Autres conseils
Eh bien, si vous voulez une hiérarchie, la meilleure méthode que je connaisse est appelée "Traversée de l’ordre de modification de l’ordre préliminaire". Ceci est décrit en détail dans cet article de Sitepoint , commence à peu près à la moitié. .
La principale différence avec Guss est qu’il est un peu plus performant et beaucoup plus facile de ne chercher que la partie de l’arbre que vous recherchez.
J'ai écrit quelque chose en groovy: http://blog.srvme.de/2009/11/29/reading-a-refensive-association-in-a-recursive-way-for-grails-and- groovy /