ホームページ  >  記事  >  データベース  >  PHP と MySQL を使用して無制限のレベルのメニューを構築する方法: 再帰的ソリューション?

PHP と MySQL を使用して無制限のレベルのメニューを構築する方法: 再帰的ソリューション?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 13:12:30571ブラウズ

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

PHP と MySQL を使用した無制限レベルのメニューの構築

複数のレベルとサブメニューを持つ複雑なメニューを構築するには、一般的なアプローチとしてデータベースを利用します。メニュー項目を整理するための構造。このような構造では、通常、トップレベルのメニューの親 ID は 0 ですが、サブメニューには親メニューの ID が割り当てられます。

サブメニューを再帰的にチェックし、それぞれのメニュー内にサブメニューを表示する必要がある場合、1 つの課題が発生します。リスト項目。 PHP と MySQL を使用してこれを実現する方法は次のとおりです。

MySQL クエリ:

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

このクエリは、すべてのメニュー項目を親子に基づいて階層順序で取得します。

PHP 実装:

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

説明:

  1. PHP コードはスタックを作成して、親メニュー ID ($parent_stack) を追跡します。
  2. 親子関係に基づいてメニュー項目をループします。
  3. メニュー項目に子がある場合、そのメニュー項目は最後に追加されますネストされた
      を含む HTML 出力文字列の
    • 現在の親 ID がスタックにプッシュされ、現在の親が現在のメニュー項目の ID に設定されます。
    • メニュー項目に子がない場合は、単純に
    • 現在の親レベルに子がもうない場合、またはスタックが空でない場合は、現在の親がスタックからポップされ、現在の親がスタックからポップされます。親は、ポップされた ID に設定されます。
    • ループは、すべてのメニュー項目が処理されるまで継続します。

このアプローチは、無制限のレベルのサブメニューを持つメニューを構築する柔軟かつ効率的な方法を提供します。再帰で発生する可能性のある無限ループのリスクはありません。

以上がPHP と MySQL を使用して無制限のレベルのメニューを構築する方法: 再帰的ソリューション?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。