Menu gerarchico di ricorsione con PHP / MySQL
Domanda
Questa dovrebbe (si spera) essere una domanda abbastanza semplice per alcuni di voi a rispondere.
Ho un menu ricorsivo funzionante da un database mySQL, ora il mio problema principale è:
Qual è il modo migliore per creare l'URL? Preferirei inserire il titolo di ogni riga come / uova / latte / pancetta /. Le uova sono di livello 0 come: uova-0, latte-1, pancetta-2. Qualche idea su come produrre questo in modo dinamico?
Praticamente vado per quello che " cletus " ha commentato alcuni commenti su questa domanda: PHP / MySQL - creazione di una gerarchia di menu di navigazione
Ma ho bisogno di qualche spiegazione in più su come farlo.
Soluzione
A meno che non si preveda di modificare spesso la struttura del menu, la pre-memorizzazione dell'URL gerarchico richiesto per ciascuna voce di menu è probabilmente la più semplice (per la risoluzione di runtime che è).
Se ti aspetti che l'albero venga modificato abbastanza spesso, diciamo - attraverso un'interfaccia web, sarebbe più facile generare i percorsi ogni volta che leggi il menu, qualcosa del genere:
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;
}
}
Non ho eseguito il debug di questo codice, l'ho testato solo per correttezza ;-)
Altri suggerimenti
Bene, se vuoi una gerarchia, sii il metodo migliore che conosco si chiama " Traversal Tree Preorder modificato " che è descritto in dettaglio in questo articolo di Sitepoint , inizia a metà circa .
La principale differenza rispetto a quanto suggerito da Guss è che è un po 'più performante e molto più semplice recuperare solo la parte dell'albero che stai cercando.
ho scritto qualcosa in groovy: http://blog.srvme.de/2009/11/29/reading-a-reflexive-association-in-a-recursive-way-for-grails-and- Groovy /