ホームページ  >  記事  >  データベース  >  PHP/MySQL で再帰なしで順序なしリスト メニュー ツリーを構築する方法

PHP/MySQL で再帰なしで順序なしリスト メニュー ツリーを構築する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 19:24:29835ブラウズ

How to Build an Unordered List Menu Tree in PHP/MySQL Without Recursion?

PHP/MySQL 順序なしリスト メニュー ツリーの構築: 非再帰的な単一データベース クエリのアプローチ

データベース クエリから順序なしリスト メニュー ツリーを構築するのは共通のタスク。通常、データベースに複数回クエリを実行する再帰関数が使用されます。ただし、単一のデータベース クエリを使用すると、より効率的な非再帰的アプローチが可能です。

id、title、parent_id 属性を持つページ オブジェクトの配列が与えられた場合、目標は、次の HTML を生成する関数を作成することです。順序なしリスト メニュー。

解決策:

このソリューションでは次の手順を採用します。

  1. ヘルパー関数 has_children を作成して、指定されたparent_id に配列内に子がある場合。
  2. ページ オブジェクトを反復処理し、メニュー リストを再帰的に構築する build_menu 関数を実装します。
  3. 最初の親 ID 0 で build_menu を呼び出して、メニュー ツリーのルートを作成します。

コード:

<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 = [
  ['id' => 1, 'title' => 'Menu 1', 'parent_id' => null],
  ... // Additional menu objects
];

echo build_menu($menu); // Outputs the complete menu list</code>

利点:

  • 非再帰的なアプローチにより、スタック オーバーフローのリスクが排除されます。
  • 単一のデータベース クエリにより、効率的なデータ取得が保証されます。
  • モジュール設計により、保守性と再利用性が容易になります。

以上がPHP/MySQL で再帰なしで順序なしリスト メニュー ツリーを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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