再帰関数によるメニュー ツリーのエコー
さまざまなルートの下に編成された階層データを含む 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 サイトの他の関連記事を参照してください。