PHP / MySQL构建树菜单

前端之家收集整理的这篇文章主要介绍了PHP / MySQL构建树菜单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@ 我正在尝试使用 PHPMysqL中的数据库构建一个未提供的列表菜单树.

我有一个从数据库返回的页面对象数组.每个页面对象都有parent_id属性,如果它没有父属性,则设置为null.这是页面对象的样子:

  1. page object
  2. id
  3. title
  4. parent_id

如果可能的话,我不想以递归方式执行,只打了一次数据库,因为我将在几乎每个请求上构建菜单.我想创建一个函数,我可以将我的对象数组传递给它,它将返回html列表.

我喜欢@ mario的解决方案,并且通过防止过量的< ul>对其进行了改进.我建议您在SQL查询中执行ORDER BY以按照您想要的顺序获取菜单(甚至可以建议将权重/序列列添加到模式中.

数据设置:

  1. $menu = array( // Presumed to have been coming from a sql SELECT,populated for demo.
  2. 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',array('id'=>4,'title'=>'Sub 1.3',array('id'=>5,'title'=>'Menu 2',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',array('id'=>9,'title'=>'Menu 3',);

处理:

  1. function has_children($rows,$id) {
  2. foreach ($rows as $row) {
  3. if ($row['parent_id'] == $id)
  4. return true;
  5. }
  6. return false;
  7. }
  8. function build_menu($rows,$parent=0)
  9. {
  10. $result = "<ul>";
  11. foreach ($rows as $row)
  12. {
  13. if ($row['parent_id'] == $parent){
  14. $result.= "<li>{$row['title']}";
  15. if (has_children($rows,$row['id']))
  16. $result.= build_menu($rows,$row['id']);
  17. $result.= "</li>";
  18. }
  19. }
  20. $result.= "</ul>";
  21.  
  22. return $result;
  23. }
  24. echo build_menu($menu);

输出

  1. <ul>
  2. <li>Menu 1<ul>
  3. <li>Sub 1.1</li>
  4. <li>Sub 1.2</li>
  5. <li>Sub 1.3</li>
  6. </ul></li>
  7. <li>Menu 2<ul>
  8. <li>Sub 2.1<ul>
  9. <li>Sub Sub 2.1.1</li>
  10. </ul></li>
  11. <li>Sub 2.2</li>
  12. </ul></li>
  13. <li>Menu 3</li>
  14. </ul>

猜你在找的PHP相关文章