Heim  >  Artikel  >  Datenbank  >  Wie kann ich mithilfe einer rekursiven PHP-Funktion effizient einen HTML-Menübaum aus hierarchischen Daten generieren, die in einer MySQL-Datenbank gespeichert sind?

Wie kann ich mithilfe einer rekursiven PHP-Funktion effizient einen HTML-Menübaum aus hierarchischen Daten generieren, die in einer MySQL-Datenbank gespeichert sind?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 18:34:02160Durchsuche

How can I efficiently generate an HTML menu tree from hierarchical data stored in a MySQL database using a recursive PHP function?

Echoender Menübaum mit rekursiver Funktion

In dem Szenario, in dem Sie eine MySQL-Datenbank mit hierarchischen Daten haben, die unter verschiedenen Wurzeln organisiert sind, kann es vorkommen, dass Sie auf Folgendes stoßen: die Notwendigkeit, einen HTML-Menübaum zu generieren, der diese Struktur repliziert. Dazu gehört die rekursive Anzeige der Stammkategorien und ihrer Unterkategorien.

Um dies zu erreichen, kann eine rekursive PHP-Funktion verwendet werden, um die Datenbankdatensätze zu durchlaufen und das HTML-Markup zu erstellen. Die Funktion benötigt die Kategoriendaten und optional eine übergeordnete Kennung und Tiefenebene.

Die Funktion durchläuft die Kategorien und sucht nach Elementen, die mit dem angegebenen übergeordneten Element übereinstimmen. Wenn eine Übereinstimmung gefunden wird, wird ein

  • Element mit einem Ankertag, der den Kategorienamen enthält. Anschließend ruft es sich selbst rekursiv auf, um ggf. untergeordnete Kategorien abzurufen und anzuhängen. Dieser Prozess wird fortgesetzt, bis alle Ebenen der Hierarchie durchlaufen wurden.

    Die folgende überarbeitete PHP-Funktion enthält Optimierungen, um leere

      Elemente werden nicht angezeigt, wenn keine untergeordneten Kategorien vorhanden sind:

      <code class="php">function recurse($categories, $parent = null, $level = 0) {
        $ret = '<ul>';
        foreach ($categories as $index => $category) {
          if ($category['root'] == $parent) {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            $sub = $this->recurse($categories, $category['id'], $level + 1);
            if ($sub != '<ul></ul>') {
              $ret .= $sub;
            }
            $ret .= '</li>';
          }
        }
        return $ret . '</ul>';
      }</code>

      Um die Leistung zu verbessern, empfiehlt es sich, die Datenbank abzufragen und ein Feld aufzunehmen, das die Anzahl der untergeordneten Kategorien für jede Kategorie angibt. Diese Informationen können verwendet werden, um zu bestimmen, ob untergeordnete Kategorien rekursiv durchlaufen werden sollen:

      <code class="php">select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category</code>

      Mit dieser Erweiterung kann die Rekursionsfunktion entsprechend geändert werden:

      <code class="php">function recurse($categories, $parent = null, $level = 0) {
        $ret = '<ul>';
        foreach ($categories as $index => $category) {
          if ($category['root'] == $parent) {
            $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
            if ($category['ChildCount'] > 0) {
              $ret .= $this->recurse($categories, $category['id'], $level + 1);
            }
            $ret .= '</li>';
          }
        }
        return $ret . '</ul>';
      }</code>

      Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe einer rekursiven PHP-Funktion effizient einen HTML-Menübaum aus hierarchischen Daten generieren, die in einer MySQL-Datenbank gespeichert sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

  • Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn