2009-03-03 7 views
2

Cela devrait (espérons-le) être une question assez facile pour certains d'entre vous de répondre.Menu de récursion hiérarchique avec PHP/MySQL

J'ai un menu récursive de travail à partir d'une base de données mySQL, maintenant mon principal problème est:

Quelle est la meilleure façon de créer l'URL? Je préférerais apporter le titre de chaque rangée comme/oeufs/lait/bacon /. Les oeufs étant de niveau 0 comme: oeufs-0, lait-1, bacon-2. Des idées sur la façon de produire dynamiquement cela?

Je vais assez bien pour ce que « Cletus » dit quelques commentaires en bas sur cette question: PHP/MySQL - building a nav menu hierarchy

Mais je besoin d'un peu plus d'explications sur la façon de le faire.

+0

Est-ce que vous éprouvez des difficultés à créer la partie URL de la liste non ordonnée comme décrit dans le poste de Cletus? – Saem

+0

Correct, la partie URL. Je ne suis pas sûr de savoir comment les empiler,/un/deux/trois/etc .. – Davy

Répondre

2

Sauf si vous prévoyez de modifier souvent votre arborescence de menus, il est probablement plus simple de stocker l'URL hiérarchique requise pour chaque élément de menu (pour une résolution d'exécution).

Si vous attendez l'arbre à modifier assez souvent, permet de dire - par le biais d'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, seulement testé pour l'exactitude ;-)

+0

Je devrais de déclaré que je ne suis pas un pro php mais de ce que je peux dire vous dites essentiellement "Si" parent "existe Ensuite, mettez 'name' dans le tableau parent ['path'] et passez à autre chose. Donc, cela mènera finalement à/milk/bacon/etc? – Davy

+0

pas exactement - $ menu finira par contenir une hiérarchie d'éléments de menu en plaçant les enfants dans le Le menu 'menu' de leur parent est le standard "un-aplatit ma liste" – Guss

+0

Le seul truc ici est de composer 'path' en préfixant le nom actuel avec le 'chemin' du parent, en construisant récursivement le chemin de chaque enfant depuis La somme de ses parents – Guss

4

Eh bien, si vous voulez une hiérarchie, la meilleure méthode que je connaisse s'appelle "Modified Preorder Tree Traversal" qui est décrite en détail in this Sitepoint article, commence à mi-chemin. La principale différence par rapport à ce que Guss a suggéré est qu'il est un peu plus performant et beaucoup plus facile de ne récupérer que la partie de l'arbre que vous recherchez.

+0

Merci pour l'info! J'ai vérifié les deux méthodes avant de commencer ce projet, mais le plus grand nombre de lignes que j'aurais à traiter est de 75 max, donc Tree Traversal semblait être trop lourd. Cependant, je vois maintenant que Tree traversal m'aurait donné un peu plus de contrôle. * le soupir. * – Davy