Maison  >  Article  >  base de données  >  Comment créer des menus de niveau illimité avec PHP et MySQL : une solution récursive ?

Comment créer des menus de niveau illimité avec PHP et MySQL : une solution récursive ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 13:12:30571parcourir

How to Build Unlimited-Level Menus with PHP and MySQL: A Recursive Solution?

Création de menus à niveaux illimités avec PHP et MySQL

Pour créer des menus complexes avec plusieurs niveaux et sous-menus, une approche courante consiste à utiliser une base de données structure pour organiser les éléments de menu. Dans de telles structures, les menus de niveau supérieur ont généralement un ID parent de 0, tandis que les sous-menus se voient attribuer l'ID de leur menu parent.

Un défi se pose lorsque vous devez vérifier les sous-menus de manière récursive et les afficher dans leurs emplacements respectifs. lister les éléments. Voici comment y parvenir en utilisant PHP et MySQL :

Requête MySQL :

SELECT id, parent_id, name, link, position
FROM menu_item
ORDER BY parent_id, position;

Cette requête récupère tous les éléments de menu dans un ordre hiérarchique en fonction de leur parent-enfant. relations.

PHP Implémentation :

<code class="php">$html = '';
$parent = 0; // Starting with the top-level menu
$parent_stack = array(); // Keeps track of parent menu IDs

// Map menu items by their parent ID
$children = array();
foreach ($items as $item) {
    $children[$item['parent_id']][] = $item;
}

while (
    // If there are more children at the current parent level
    ($option = each($children[$parent])) ||
    // Or if we need to backtrack to a previous parent level
    ($parent > 0)
) {
    if (!empty($option)) {
        // Handle menu items with children
        if (!empty($children[$option['value']['id']])) {
            $html .= '<li>' . $option['value']['name'] . '</li>';
            $html .= '<ul class="submenu">';
            array_push($parent_stack, $parent); // Push current parent ID to the stack
            $parent = $option['value']['id']; // Set current parent to the current menu item's ID
        }
        // Handle menu items without children
        else {
            $html .= '<li>' . $option['value']['name'] . '</li>';
        }
    } else {
        // Backtrack to the previous menu level
        $html .= '</ul>';
        $parent = array_pop($parent_stack); // Pop the last parent ID from the stack
    }
}

// Output the resulting HTML
echo $html;</code>

Explication :

  1. Le code PHP crée une pile pour garder une trace des identifiants de menu parent ($parent_stack).
  2. Il parcourt les éléments de menu en fonction de leurs relations parent-enfant.
  3. Si un élément de menu a des enfants, il est ajouté à la fin de la chaîne de sortie HTML avec un signe
      pour son sous-menu.
    • L'ID parent actuel est poussé sur la pile et le parent actuel est défini sur l'ID de l'élément de menu actuel.
    • Si un élément de menu n'a pas d'enfants, c'est simplement ajouté à la chaîne de sortie HTML en tant que
    • .
    • S'il n'y a plus d'enfants au niveau parent actuel ou si la pile n'est pas vide, le parent actuel est extrait de la pile, et le parent actuel est défini sur l'ID affiché.
    • La boucle continue jusqu'à ce que tous les éléments de menu aient été traités.

Cette approche fournit un moyen flexible et efficace de créer des menus avec des niveaux illimités de sous-menus sans risque de boucles infinies qui peuvent se produire avec la récursivité.

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