PHP / MySQL build tree menu

后端 未结 3 857
夕颜
夕颜 2020-11-29 03:24

I am trying to build an un-oredered list menu tree from my database in PHP and MySQL.

I have an array of page objects I am returning from the db. Each page object

3条回答
  •  清歌不尽
    2020-11-29 03:37

    I like @mario's solution, and have improved on it with the prevention of the excess

      . I would just recommend doing an ORDER BY on your SQL query to get the menu in the order you want (might even recommend a weight/sequence column be added to the schema.

      Data setup:

      $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),
      );
      

      Handling:

      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 = "
        "; foreach ($rows as $row) { if ($row['parent_id'] == $parent){ $result.= "
      • {$row['title']}"; if (has_children($rows,$row['id'])) $result.= build_menu($rows,$row['id']); $result.= "
      • "; } } $result.= "
      "; return $result; } echo build_menu($menu);

      Output:

      • Menu 1
        • Sub 1.1
        • Sub 1.2
        • Sub 1.3
      • Menu 2
        • Sub 2.1
          • Sub Sub 2.1.1
        • Sub 2.2
      • Menu 3

提交回复
热议问题