再帰関数を使用したメニュー ツリーのエコー
問題:
特定のデータ構造に対する再帰関数の構築は共通の課題です。ここでは、階層メニューを表示するために再帰関数が必要な状況を示します。
状況:
ルート列が各レコードの親カテゴリを示す 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 サイトの他の関連記事を参照してください。