Heim  >  Artikel  >  Datenbank  >  Wie erstellt man Menüs mit unbegrenzter Ebene mit PHP und MySQL: Eine rekursive Lösung?

Wie erstellt man Menüs mit unbegrenzter Ebene mit PHP und MySQL: Eine rekursive Lösung?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 13:12:30648Durchsuche

How to Build Unlimited-Level Menus with PHP and MySQL: A Recursive Solution?

Erstellen von Menüs mit unbegrenzten Ebenen mit PHP und MySQL

Um komplexe Menüs mit mehreren Ebenen und Untermenüs zu erstellen, ist ein gängiger Ansatz die Verwendung einer Datenbank Struktur zum Organisieren von Menüpunkten. In solchen Strukturen haben Menüs der obersten Ebene normalerweise die übergeordnete ID 0, während Untermenüs die ID ihres übergeordneten Menüs zugewiesen wird.

Eine Herausforderung entsteht, wenn Sie rekursiv nach Untermenüs suchen und diese in ihren jeweiligen Menüs anzeigen müssen Elemente auflisten. So erreichen Sie dies mit PHP und MySQL:

MySQL-Abfrage:

SELECT id, parent_id, name, link, position
FROM menu_item
ORDER BY parent_id, position;

Diese Abfrage ruft alle Menüelemente in einer hierarchischen Reihenfolge basierend auf ihrem Eltern-Kind-Menü ab Beziehungen.

PHP-Implementierung:

<code class="php">$html = '';
$parent = 0; // Starting with the top-level menu
$parent_stack = array(); // Keeps track of parent menu IDs

// Map menu items by their parent ID
$children = array();
foreach ($items as $item) {
    $children[$item['parent_id']][] = $item;
}

while (
    // If there are more children at the current parent level
    ($option = each($children[$parent])) ||
    // Or if we need to backtrack to a previous parent level
    ($parent > 0)
) {
    if (!empty($option)) {
        // Handle menu items with children
        if (!empty($children[$option['value']['id']])) {
            $html .= '<li>' . $option['value']['name'] . '</li>';
            $html .= '<ul class="submenu">';
            array_push($parent_stack, $parent); // Push current parent ID to the stack
            $parent = $option['value']['id']; // Set current parent to the current menu item's ID
        }
        // Handle menu items without children
        else {
            $html .= '<li>' . $option['value']['name'] . '</li>';
        }
    } else {
        // Backtrack to the previous menu level
        $html .= '</ul>';
        $parent = array_pop($parent_stack); // Pop the last parent ID from the stack
    }
}

// Output the resulting HTML
echo $html;</code>

Erklärung:

  1. Der PHP-Code erstellt einen Stapel zu Verfolgen Sie die übergeordneten Menü-IDs ($parent_stack).
  2. Es durchläuft die Menüelemente basierend auf ihren Eltern-Kind-Beziehungen.
  3. Wenn ein Menüelement untergeordnete Elemente hat, wird es am Ende hinzugefügt des HTML-Ausgabestrings mit einem verschachtelten
      für sein Untermenü.
    • Die aktuelle übergeordnete ID wird auf den Stapel gelegt und das aktuelle übergeordnete Element wird auf die ID des aktuellen Menüelements gesetzt.
    • Wenn ein Menüelement keine untergeordneten Elemente hat, ist es einfach als
    • zur HTML-Ausgabezeichenfolge hinzugefügt.
    • Wenn auf der aktuellen übergeordneten Ebene keine weiteren untergeordneten Elemente vorhanden sind oder der Stapel nicht leer ist, wird das aktuelle übergeordnete Element aus dem Stapel entfernt und das aktuelle Das übergeordnete Element wird auf die gepoppte ID gesetzt.
    • Die Schleife wird fortgesetzt, bis alle Menüelemente verarbeitet wurden.

Dieser Ansatz bietet eine flexible und effiziente Möglichkeit, Menüs mit unbegrenzten Ebenen von Untermenüs zu erstellen ohne das Risiko von Endlosschleifen, die bei der Rekursion auftreten können.

Das obige ist der detaillierte Inhalt vonWie erstellt man Menüs mit unbegrenzter Ebene mit PHP und MySQL: Eine rekursive Lösung?. 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