Heim >Datenbank >MySQL-Tutorial >Wie kann man flache Daten effizient und ohne Rekursion in ein hierarchisch verschachteltes Menü in PHP und MySQL umwandeln?

Wie kann man flache Daten effizient und ohne Rekursion in ein hierarchisch verschachteltes Menü in PHP und MySQL umwandeln?

Susan Sarandon
Susan SarandonOriginal
2024-10-31 19:23:29915Durchsuche

How to Efficiently Transform Flat Data into a Hierarchical Nested Menu in PHP and MySQL without Recursion?

Flache Daten zu hierarchisch verschachteltem Menü:

Der Aufbau eines ungeordneten Listenmenübaums aus einer Datenbank kann eine häufige Aufgabe in der Webentwicklung sein. Um dies in PHP und MySQL zu erreichen, ohne auf Rekursion und Datenbankabfragen zurückgreifen zu müssen, können Sie einen Single-Pass-Algorithmus zur Verarbeitung Ihrer Seitenobjekte verwenden.

Die bereitgestellten Seitenobjekte verfügen über ein parent_id-Attribut, das Eltern-Kind-Beziehungen angibt . Um den Menübaum zu erstellen, benötigen Sie eine Funktion wie diese:

<code class="php">function build_menu($page_objects) {

  // Create an array to store parent-child relationships
  $parents = array();

  // Loop through the page objects
  foreach ($page_objects as $page) {
    $parents[$page['id']] = $page['parent_id'];
  }

  // Initialize the menu string
  $menu = '';

  // Loop through the page objects again
  foreach ($page_objects as $page) {

    // Check if the current page has no parent (root page)
    if (!isset($parents[$page['id']])) {
      $menu .= "<ul><li>{$page['title']}";
    }

    // Handle child pages
    else {
      $parent_id = $parents[$page['id']];

      // Find the parent 'ul' tag for the child page
      $parent_index = strrpos($menu, "<li>{$page_objects[$parent_id]['title']}");

      // Append the child page to the parent 'ul' tag
      $menu = substr_replace($menu, "<li>{$page['title']}", $parent_index + strlen($page_objects[$parent_id]['title']) + 4, 0);
    }

    // Close the 'li' tag
    $menu .= '</li>';

    // Handle closing the 'ul' tag for root pages
    if (!isset($parents[$page['parent_id']])) {
      $menu .= "</ul>";
    }
  }

  return $menu;
}</code>

Verwendung:

Zum Beispiel mit den bereitgestellten Seitenobjekten:

<code class="php">$page_objects = array(
    array('id' => 1, 'title' => 'Menu 1', 'parent_id' => null),
    array('id' => 2, 'title' => 'Sub 1.1', 'parent_id' => 1),
    array('id' => 3, 'title' => 'Sub 1.2', 'parent_id' => 1),
    array('id' => 4, 'title' => 'Sub 1.3', 'parent_id' => 1),
    array('id' => 5, 'title' => 'Menu 2', 'parent_id' => null),
    array('id' => 6, 'title' => 'Sub 2.1', 'parent_id' => 5),
    array('id' => 7, 'title' => 'Sub Sub 2.1.1', 'parent_id' => 6),
    array('id' => 8, 'title' => 'Sub 2.2', 'parent_id' => 5),
    array('id' => 9, 'title' => 'Menu 3', 'parent_id' => null)
);</code>

Sie können den Menübaum generieren, indem Sie die Funktion aufrufen:

<code class="php">$menu_html = build_menu($page_objects);</code>

Dadurch wird die gewünschte HTML-Liste erstellt, die die verschachtelte Menüstruktur darstellt.

Das obige ist der detaillierte Inhalt vonWie kann man flache Daten effizient und ohne Rekursion in ein hierarchisch verschachteltes Menü in PHP und MySQL umwandeln?. 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