PHP と MySQL を使用してメニュー ツリーを構築するには、データベースからメニュー項目の階層リストを表示する必要があります。この記事では、再帰やデータベースへの複数回のアクセスを行わずにこれを実現する方法に関するユーザーの質問に対処します。
データ構造:
提供された例は、データベースでは、各オブジェクトに id、title、parent_id があります。 null のparent_id は、ルートレベルのメニュー項目を示します。
<code class="php">page object id title parent_id</code>
解決策:
推奨されるアプローチには、データベース内のメニュー項目を事前に並べ替えて、希望の順序。これは、データベース スキーマに重み列または順序列を追加し、その列によってクエリ結果を並べ替えることによって実行できます。
<code class="php">function has_children($rows,$id) { foreach ($rows as $row) { if ($row['parent_id'] == $id) return true; } return false; } function build_menu($rows,$parent=0) { $result = "<ul>"; foreach ($rows as $row) { if ($row['parent_id'] == $parent){ $result.= "<li>{$row['title']}"; if (has_children($rows,$row['id'])) $result.= build_menu($rows,$row['id']); $result.= "</li>"; } } $result.= "</ul>"; return $result; }</code>
出力例:
提供されたメニュー項目:
<code class="php">$menu = array( array('id'=>1,'title'=>'Menu 1', 'parent_id'=>null), array('id'=>2,'title'=>'Sub 1.1', 'parent_id'=>1), array('id'=>3,'title'=>'Sub 1.2', 'parent_id'=>1), array('id'=>4,'title'=>'Sub 1.3', 'parent_id'=>1), array('id'=>5,'title'=>'Menu 2', 'parent_id'=>null), array('id'=>6,'title'=>'Sub 2.1', 'parent_id'=>5), array('id'=>7,'title'=>'Sub Sub 2.1.1', 'parent_id'=>6), array('id'=>8,'title'=>'Sub 2.2', 'parent_id'=>5), array('id'=>9,'title'=>'Menu 3', 'parent_id'=>null), );</code>
build_menu($menu) を呼び出すと、次の HTML 出力が生成されます:
<code class="html"><ul> <li>Menu 1 <ul> <li>Sub 1.1</li> <li>Sub 1.2</li> <li>Sub 1.3</li> </ul> <li>Menu 2 <ul> <li>Sub 2.1 <ul> <li>Sub Sub 2.1.1</li> </ul> <li>Sub 2.2</li> </ul> <li>Menu 3</li> </ul></code>
以上が再帰や複数のデータベースクエリを使用せずに、PHP でツリー構造のメニューを構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。