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 ...

War es hilfreich?

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 transformieren

Es 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top