Maison > Article > base de données > Comment générer efficacement une arborescence de menu HTML à partir de données hiérarchiques stockées dans une base de données MySQL à l'aide d'une fonction PHP récursive ?
Arbre de menu en écho avec fonction récursive
Dans le scénario où vous disposez d'une base de données MySQL avec des données hiérarchiques organisées sous différentes racines, vous pouvez rencontrer la nécessité de générer une arborescence de menu HTML reproduisant cette structure. Cela implique d'afficher les catégories racines et leurs sous-catégories de manière récursive.
Pour ce faire, une fonction PHP récursive peut être utilisée pour parcourir les enregistrements de la base de données et construire le balisage HTML. La fonction nécessite les données des catégories et éventuellement un identifiant parent et un niveau de profondeur.
La fonction parcourt les catégories, recherchant les éléments qui correspondent au parent spécifié. Si une correspondance est trouvée, elle génère un message
La fonction PHP révisée suivante intègre des optimisations pour empêcher les
<code class="php">function recurse($categories, $parent = null, $level = 0) { $ret = '<ul>'; foreach ($categories as $index => $category) { if ($category['root'] == $parent) { $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>'; $sub = $this->recurse($categories, $category['id'], $level + 1); if ($sub != '<ul></ul>') { $ret .= $sub; } $ret .= '</li>'; } } return $ret . '</ul>'; }</code>
Pour améliorer les performances, il est conseillé d'interroger la base de données pour inclure un champ indiquant le nombre de catégories enfants pour chaque catégorie. Ces informations peuvent être utilisées pour déterminer s'il faut parcourir de manière récursive les catégories enfants :
<code class="php">select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category</code>
Avec cette amélioration, la fonction récursive peut être modifiée en conséquence :
<code class="php">function recurse($categories, $parent = null, $level = 0) { $ret = '<ul>'; foreach ($categories as $index => $category) { if ($category['root'] == $parent) { $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>'; if ($category['ChildCount'] > 0) { $ret .= $this->recurse($categories, $category['id'], $level + 1); } $ret .= '</li>'; } } return $ret . '</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!