ホームページ  >  記事  >  データベース  >  再帰関数を使用して、階層的な MySQL データベース テーブルからマルチレベル HTML メニュー ツリーを生成するにはどうすればよいですか?

再帰関数を使用して、階層的な MySQL データベース テーブルからマルチレベル HTML メニュー ツリーを生成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-29 06:48:31528ブラウズ

How can a recursive function be used to generate a multi-level HTML menu tree from a hierarchical MySQL database table?

再帰関数を使用したメニュー ツリーのエコー

問題:
特定のデータ構造に対する再帰関数の構築は共通の課題です。ここでは、階層メニューを表示するために再帰関数が必要な状況を示します。

状況:
ルート列が各レコードの親カテゴリを示す MySQL データベース テーブルがあるとすると、次のように作成します。複数のレベルを持つ HTML メニュー ツリー。必要な HTML 構造は次のとおりです:

<code class="html"><li><a href="#"><p class="Tier0">Datori</p></a>
    <ul style="display: block">
        <li><a href="#"><p class="Tier1">Cookies</p></a></li>
        <li><a href="#"><p class="Tier1">Events</p></a></li>
        <li><a href="#"><p class="Tier1">Forms</p></a></li>
        <li><a href="#"><p class="Tier1">Games</p></a></li>
        <li><a href="#"><p class="Tier1">Images</p></a>
            <ul>
                <li><a href="#"><p class="Tier2">CSS</p></a></li>
                <li><a href="#"><p class="Tier2">JavaScript</p></a></li>
                <li><a href="#"><p class="Tier2">JQuery</p></a></li>
            </ul>
        </li>
        <li><a href="#"><p class="Tier1">Navigations</p></a>
            <ul>
                <li><a href="#"><p class="Tier2">CSS</p></a></li>
                <li><a href="#"><p class="Tier2">JavaScript</p></a></li>
                <li><a href="#"><p class="Tier2">JQuery</p></a></li>
            </ul>
        </li>
        <li><a href="#"><p class="Tier1">Tabs</p></a></li>
    </ul>
</li>
<li><a href="#"><p class="Tier0">Washing Machines</p></a></li></code>

関数:
HTML ツリー構造を生成する再帰関数は次のとおりです:

<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>';
            $ret .= $this->recurse($categories, $category['id'], $level+1);
            $ret .= '</li>';
        }
    }
    return $ret . '</ul>';
}</code>

実行:

<code class="php">// Fetch categories from the database
$categories = { get from database into a multi-dimensional array };

// Generate HTML tree
$Tree = $this->recurse($categories);

// Output the result
echo $Tree;</code>

最適化:
空のネストを防ぐため

    子カテゴリのない親カテゴリの要素を追加するには、次のように関数を変更します。

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

    最適なパフォーマンスを得るには、データベース テーブルに ChildCount 列を追加して、各親の子カテゴリの数を示し、それに応じて機能します。これにより、再帰中の不必要なデータベース検索が回避されます。

    以上が再帰関数を使用して、階層的な MySQL データベース テーブルからマルチレベル HTML メニュー ツリーを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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