ホームページ  >  記事  >  データベース  >  再帰や複数のデータベースクエリを使用せずに、PHP でツリー構造のメニューを構築するにはどうすればよいですか?

再帰や複数のデータベースクエリを使用せずに、PHP でツリー構造のメニューを構築するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 14:46:01643ブラウズ

How to Build a Tree-Structured Menu in PHP Without Recursion or Multiple Database Queries?

PHP でツリー構造のメニューを構築する

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 サイトの他の関連記事を参照してください。

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