PHP / MySQL - Aufbau einer nav Menühierarchie
Frage
Also das letzte Menü etwas wie folgt aussehen:
Item B
Item B-1
Item B-1-2
Item B-1-1
Item A
SubItem A-1
SubItem A-2
Item C
Auf der Grundlage der folgenden DB Datensätze:
id menu_title parent_menu_id menu_level weight
1 Item A 0 1 1
2 Item B 0 1 0
3 Item C 0 1 2
4 SubItem A-2 1 2 1
5 Item B-1 2 2 0
6 Item B-1-1 5 3 1
7 SubItem A-1 1 2 0
8 Item B-1-2 5 3 0
Wie würde ich mich über das Anzeigen? Meine Vermutung ist, wird es beinhalten alle Elemente in einem mehrdimensionalen Array zu speichern, dann durch sie Looping irgendwie ...
Lösung
mit der Datenstruktur Umgang, wie Sie haben es oft Rekursion oder mehrere Abfragen beinhaltet, um den Baum zu bauen.
Haben Sie andere Möglichkeiten in Betracht gezogen, eine Hierarchie zu speichern? Check out modifizierte vorbestellen Traversal - hier ist ein schöner PHP-basierte Artikel über diese .
Andere Tipps
Hierarchische Daten sind etwas ärgerlich in einer relationsal Datenbank (mit Ausnahme von Oracle, die Betreiber in START WITH/CONNECT BY
hat damit zu umgehen). Grundsätzlich gibt es zwei Modelle . Adjazenzliste und verschachtelte Sätze
Sie haben adjacency Sets gewählt, das ist, was typischerweise zu ich. Es ist viel einfacher zu ändern, als die Nested Sets, obwohl das verschachtelte Satz Modell in der richtigen Reihenfolge in einer einzigen Abfrage abgerufen werden kann. Adjazenzlisten kann nicht sein. Sie benötigen eine Zwischendatenstruktur (Baum) und dann konvertieren, dass in eine Liste erstellen.
Was ich tun würde (und haben vor kurzem in der Tat getan) ist:
- Wählen Sie die gesamten Menüinhalte in einer Abfrage von Eltern ID bestellt;
- Erstellen Sie einen Baum der Menüstruktur mit assoziativen Arrays oder Klassen / Objekte;
- Gehen Sie diesen Baum verschachtelte ungeordnete Listen zu erstellen; und
- Verwenden Sie eine jQuery-Plug-in wie Superfish diese Liste wiederum in ein Menü.
Sie bauen so etwas wie folgt aus:
$menu = array(
array(
'name' => 'Home',
'url' => '/home',
),
array(
'name' => 'Account',
'url' => '/account',
'children' => array(
'name' => 'Profile',
'url' => '/account/profile',
),
),
// etc
);
und wandeln es in diese:
<ul class="menu">;
<li><a href="/">Home</a></li>
<li><a href="/account">Account Services</a>
<ul>
<li><a href="/account/profile">Profile</a></li>
...
Die PHP zum Erzeugen des Menüs Array aus sind relativ einfach, aber ein bisschen finnicky zu lösen. Sie verwenden eine rekursive Tree-Walking-Funktion, die die HTML-verschachtelte Liste Markup erstellt wird aber läßt es Implementierung als eine Übung für den Leser. :)
Die Art und Weise Ihre Speicherung hierarchische Daten sind nicht so effizient, wie Sie wollen könnten. Ich las den Artikel Verwalten hierarchischer Daten in MySQL ein paar Jahren vor und haben, da es als fand die beste Lösung Hierarchie basierte Daten in SQL verwalten. Als nächstes bester Vorteil ist, dass ich glaube, können Sie den gesamten Baum mit einer Abfrage greifen.
Ich habe gerade in einer ähnlichen Frage meinen eigenen Ansatz geschrieben MySQL hierarchische Daten (Adjazenzliste) in ein Menü (HTML)
zu transformierenEs hat nicht Verwendung Rekursion. Und es erfordert eine einzelne Abfrage in der Datenbank.
Lesen Sie mehr bei
https://stackoverflow.com/questions/2871861#3368622
Danke.
Eine weitere einfache Möglichkeit Sie Hierarchie erzeugen können, wenn Sie verschachtelte Gruppen nicht verwenden möchten, ist eine einfache Textzeichenfolge vor verwenden.
Item B
Item B-1
Item B-1-2
Item B-1-1
Item A
SubItem A-1
SubItem A-2
Item C
würde
1 Item B
1.1 Item B1
1.1.1 Item B11
1.1.2 Item B12
2 Item A
2.1 Item A1
2.2 Item B2
3 Item C
Die Ziffer vor jedem Elemente in einem Feld gespeichert werden könnte und analysiert basierend auf Länge (die die Tiefe, wo es ist), Ihnen zu sagen alles, was Sie brauchen, um darüber zu wissen, wohin es geht.
Ich verwende verschachtelte Sethierarchien für kompliziertere Dinge, die Berechnung, e tc erfordert, aber ich finde, dieser Ansatz hat dazu gedient, gut