sql >> データベース >  >> RDS >> Mysql

PHP/MySQLビルドツリーメニュー

    私は@marioのソリューションが好きで、過剰な<ul>を防ぐことで改善しました。 。 ORDER BYを実行することをお勧めします SQLクエリで、希望する順序でメニューを取得します(ウェイト/シーケンス列をスキーマに追加することをお勧めする場合もあります。

    データ設定:

    $menu = array( // Presumed to have been coming from a SQL SELECT, populated for demo.
      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),
    );
    

    取り扱い:

    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;
    }
    echo build_menu($menu);
    

    出力:

    <ul>
      <li>Menu 1<ul>
        <li>Sub 1.1</li>
        <li>Sub 1.2</li>
        <li>Sub 1.3</li>
      </ul></li>
      <li>Menu 2<ul>
        <li>Sub 2.1<ul>
          <li>Sub Sub 2.1.1</li>
        </ul></li>
        <li>Sub 2.2</li>
      </ul></li>
      <li>Menu 3</li>
    </ul>


    1. Oracleでxml要素の値を選択します

    2. NodeJSPostgresエラーgetaddrinfoENOTFOUND

    3. Oracleで制約の名前を見つける方法

    4. Prometheusを使用してPostgreSQLモニタリングをパーソナライズする新しい方法