Maison  >  Article  >  base de données  >  Comment créer un menu arborescent en PHP sans récursion ni requêtes de bases de données multiples ?

Comment créer un menu arborescent en PHP sans récursion ni requêtes de bases de données multiples ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 14:46:01643parcourir

How to Build a Tree-Structured Menu in PHP Without Recursion or Multiple Database Queries?

Créer un menu arborescent en PHP

Construire une arborescence de menu à l'aide de PHP et MySQL implique de présenter une liste hiérarchique d'éléments de menu à partir d'une base de données. Cet article répond à la requête d'un utilisateur sur la façon d'y parvenir sans récursion ni accès à la base de données plusieurs fois.

Structure des données :

L'exemple fourni décrit les objets de page récupérés à partir d'un base de données, où chaque objet a un identifiant, un titre et un parent_id. Un parent_id de null indique un élément de menu au niveau racine.

<code class="php">page object
  id
  title
  parent_id</code>

Solution :

L'approche recommandée consiste à pré-trier les éléments de menu dans la base de données pour garantir l'ordre souhaité. Cela peut être fait en ajoutant une colonne de poids ou de séquence au schéma de base de données et en classant les résultats de la requête en fonction de cette colonne.

<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 de résultat :

Étant donné le éléments de menu fournis :

<code class="php">$menu = 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>

L'appel de build_menu($menu) produira la sortie HTML suivante :

<code class="html"><ul>
  <li>Menu 1
    <ul>
      <li>Sub 1.1</li>
      <li>Sub 1.2</li>
      <li>Sub 1.3</li>
    </ul>
  <li>Menu 2
    <ul>
      <li>Sub 2.1
        <ul>
          <li>Sub Sub 2.1.1</li>
        </ul>
      <li>Sub 2.2</li>
    </ul>
  <li>Menu 3</li>
</ul></code>

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