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!