ホームページ  >  記事  >  データベース  >  PHP と MySQL を使用して無制限のネストされたメニュー システムを構築する方法: 非再帰的アプローチ?

PHP と MySQL を使用して無制限のネストされたメニュー システムを構築する方法: 非再帰的アプローチ?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 18:41:12492ブラウズ

How to Build a Limitless Nested Menu System with PHP and MySQL: A Non-Recursive Approach?

PHP および MySQL で無制限のネストされたメニューを表示する方法

問題の説明

ネストされたメニュー システムでは、各メニュー項目が子メニュー項目を持つことができます、さらに独自の子項目を持つことができます。目標は、これらのネストされたメニュー レベルをデータベースから効果的に取得して表示することです。

コード実装

これを達成するには、次のような 非再帰的 アプローチを採用できます。 :

  • データベース クエリ: menu_item テーブルをクエリし、結果を親と位置で並べ替えます。
  • 多次元配列 : 取得したメニュー項目を多次元配列に編成します。各要素は親子関係を表します。
  • ツリー トラバーサル: ループを使用してこの配列を走査します。
  • HTML 生成: ネストされたメニューの HTML 構造を動的に生成します。

PHP 関数

上記のアプローチを示す PHP 関数を次に示します。

<code class="php">function generateMenu($items) {
    $html = '';
    $parent = 0;
    $parentStack = array();

    $children = array();
    foreach ($items as $item) {
        $children[$item['parent_id']][] = $item;
    }

    while (($option = each($children[$parent])) || ($parent > 0)) {
        if (!empty($option)) {
            // 1) Item with children
            if (!empty($children[$option['value']['id']])) {
                $html .= '<li>' . $option['value']['title'] . '</li>';
                $html .= '<ul>';
                array_push($parentStack, $parent);
                $parent = $option['value']['id'];
            }
            // 2) Item without children
            else {
                $html .= '<li>' . $option['value']['title'] . '</li>';
            }
        }
        // 3) Current parent has no more children
        else {
            $html .= '</ul>';
            $parent = array_pop($parentStack);
        }
    }

    return $html;
}</code>

使用法

この関数を使用するには、まずデータベースからメニュー項目を取得し、それらを配列としてgenerateMenu()関数に渡します。結果として得られる HTML は、階層メニュー構造を表す一連のネストされた順序なしリストになります。

非再帰的アプローチの利点

この非再帰的アプローチにより、次のような場合に発生する可能性のある無限ループのリスクが排除されます。再帰により、ネストされたメニューを生成するためのより安定した効率的なソリューションになります。

以上がPHP と MySQL を使用して無制限のネストされたメニュー システムを構築する方法: 非再帰的アプローチ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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