Maison >base de données >tutoriel mysql >Comment créer une arborescence de menus de liste non ordonnée en PHP/MySQL sans récursion ?

Comment créer une arborescence de menus de liste non ordonnée en PHP/MySQL sans récursion ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 19:24:29866parcourir

How to Build an Unordered List Menu Tree in PHP/MySQL Without Recursion?

Construction d'arborescence de menus de listes non ordonnées PHP/MySQL : une approche de requête de base de données unique non récursive

Construire des arborescences de menus de listes non ordonnées à partir de requêtes de base de données est une tâche commune. En règle générale, des fonctions récursives qui interrogent la base de données plusieurs fois sont utilisées. Cependant, une approche non récursive plus efficace est possible en utilisant une seule requête de base de données.

Étant donné un tableau d'objets de page avec les attributs id, title et parent_id, l'objectif est de créer une fonction qui génère le code HTML pour un menu de liste non ordonné.

Solution :

Notre solution utilise les étapes suivantes :

  1. Créer une fonction d'assistance, has_children, pour déterminer si un parent_id donné a des enfants dans le tableau.
  2. Implémentez une fonction build_menu qui parcourt les objets de la page et construit la liste de menus de manière récursive.
  3. Appelez build_menu avec l'ID parent initial de 0 à créez la racine de l'arborescence du menu.

Code :

<code class="php">function has_children($rows, $id) {
  foreach ($rows as $row) {
    if ($row['parent_id'] == $id){
      return true;
    }
  }
  return false;
}

function build_menu($rows, $parent=0) {
  $result = "<ul>";
  foreach ($rows as $row) {
    if ($row['parent_id'] == $parent){
      $result.= "<li>{$row['title']}";
      if (has_children($rows,$row['id'])) {
        $result.= build_menu($rows,$row['id']);
      }
      $result.= "</li>";
    }
  }
  $result.= "</ul>";

  return $result;
}</code>

Exemple d'utilisation :

<code class="php">$menu = [
  ['id' => 1, 'title' => 'Menu 1', 'parent_id' => null],
  ... // Additional menu objects
];

echo build_menu($menu); // Outputs the complete menu list</code>

Avantages :

  • L'approche non récursive élimine le risque de débordement de pile.
  • Une requête de base de données unique garantit une récupération efficace des données.
  • La conception modulaire facilite la maintenabilité et la réutilisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn