我有一个从数据库返回的页面对象数组.每个页面对象都有parent_id属性,如果它没有父属性,则设置为null.这是页面对象的样子:
- page object
- id
- title
- parent_id
如果可能的话,我不想以递归方式执行,只打了一次数据库,因为我将在几乎每个请求上构建菜单.我想创建一个函数,我可以将我的对象数组传递给它,它将返回html列表.
我有一个从数据库返回的页面对象数组.每个页面对象都有parent_id属性,如果它没有父属性,则设置为null.这是页面对象的样子:
- page object
- id
- title
- parent_id
如果可能的话,我不想以递归方式执行,只打了一次数据库,因为我将在几乎每个请求上构建菜单.我想创建一个函数,我可以将我的对象数组传递给它,它将返回html列表.
数据设置:
- $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',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',);
处理:
- 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>