Maison >base de données >tutoriel mysql >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 ?

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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 18:34:02258parcourir

How can I efficiently generate an HTML menu tree from hierarchical data stored in a MySQL database using a recursive PHP function?

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

  • élément avec une balise d’ancrage contenant le nom de la catégorie. Il s'appelle ensuite de manière récursive pour récupérer et ajouter les catégories enfants, le cas échéant. Ce processus se poursuit jusqu'à ce que tous les niveaux de la hiérarchie aient été parcourus.

    La fonction PHP révisée suivante intègre des optimisations pour empêcher les

      éléments d'apparaître lorsqu'il n'y a pas de catégories enfants :

      <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!

  • 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