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

再帰的な PHP 関数を使用して、MySQL データベースに保存されている階層データから HTML メニュー ツリーを効率的に生成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-29 18:34:02160ブラウズ

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

再帰関数によるメニュー ツリーのエコー

さまざまなルートの下に編成された階層データを含む MySQL データベースがあるシナリオでは、次のような問題が発生する可能性があります。この構造を複製する HTML メニュー ツリーを生成する必要があるためです。これには、ルート カテゴリとそのサブカテゴリを再帰的に表示することが含まれます。

これを実現するには、再帰的な PHP 関数を使用してデータベース レコードを走査し、HTML マークアップを構築します。この関数にはカテゴリ データが必要で、オプションで親識別子と深さレベルも必要です。

関数はカテゴリを反復処理して、指定された親に一致する要素を検索します。一致するものが見つかった場合は、

  • が生成されます。カテゴリ名を含むアンカー タグを持つ要素。次に、それ自体を再帰的に呼び出して、子カテゴリがあれば取​​得して追加します。このプロセスは、階層のすべてのレベルが完了するまで続きます。

    次の改訂された PHP 関数には、空の

      を防ぐための最適化が組み込まれています。子カテゴリがない場合に要素が表示されないようにする:

      <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>';
      }</p>
      <p>パフォーマンスを向上させるには、データベースにクエリを実行して、各カテゴリの子カテゴリの数を示すフィールドを含めることをお勧めします。この情報は、子カテゴリを再帰的に走査するかどうかを決定するために利用できます:</p>
      <pre class="brush:php;toolbar:false"><code class="php">select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category</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>';
            if ($category['ChildCount'] > 0) {
              $ret .= $this->recurse($categories, $category['id'], $level + 1);
            }
            $ret .= '</li>';
          }
        }
        return $ret . '</ul>';
      }</code>

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

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