代码之家  ›  专栏  ›  技术社区  ›  Niladri Banerjee - Uttarpara

Laravel 5.5创建菜单的递归函数

  •  0
  • Niladri Banerjee - Uttarpara  · 技术社区  · 6 年前

    我创建了一个mysql表,如下所示:

    id | menuname          | parentid
    ---+-------------------+---------
     1 | dashboard         |        0
     2 | Content           |        0
     3 | Home Page Content |        2
     4 | Banners           |        2
     5 | Settings          |        0
     6 | Block Content     |        3
     7 | Site Content      |        3
    

    因此,菜单结构如下所示:

    • 仪表板
    • 所容纳之物
      • 主页内容
        • 阻止内容
        • 网站内容
    • 横幅
    • 设置

    我有控制器:

    public function index() {
        $data = array();
    
        $permissionRecord = Permission::all();
        $this->categoryTree($permissionRecord);
    
        dd('-end-);
        $data['permissionRecord'] = $permissionRecord;
    
        return view('Administrator.permission.permissionAdd',$data);
    }
    
    function categoryTree($permissionRecord, $parent_id = 0, $sub_mark = '')
    {
        foreach($permissionRecord as $row) {
            echo $sub_mark.$row->name;
    
            $this->categoryTree($permissionRecord, $row->id, $sub_mark.'---');
        }
    }
    

    但这显示了数据:

    仪表板-----仪表板-----仪表板-----仪表板-----仪表板-----仪表板-----仪表板-----仪表板---------------------------------仪表板----------------------------------------仪表板-----------------------------------仪表板-----------------------------------仪表板

    请注意,我dd()位于控制器内部,没有将数据传递给视图。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Phil Cross    6 年前

    您尚未说明父ID:

    function categoryTree($permissionRecord, $parent_id = 0, $sub_mark = '')
    {
        foreach($permissionRecord as $row) {
            if ($row->parentid == $parent_id) {
                echo $sub_mark.$row->name;
    
                $this->categoryTree($permissionRecord, $row->id, $sub_mark.'---');
            }
        }
    }
    

    尝试一下,看看会发生什么-注意,我已经将递归函数调用包装在 if() 检查当前记录的parentId是否等于传递给方法的父ID。

    要使其在缩进列表中显示项目,请执行以下操作:

    public function categoryTree($permissionRecord, $parent_id = 0)
    {
        $html = '<ul>';
    
        foreach($permissionRecord as $row) {
            if ($row->parentid == $parent_id) {
                $html .= '<li>' . $row->menuname;
    
                $html .= $this->categoryTree($permissionRecord, $row->id, $html);
    
                $html .= '</li>';
            }
        }
    
        $html .= '</ul>';
    
        return $html;
    }
    

    然后打电话:

    $html = $this->categoryTree($permissionRecord);
    

    使用单元测试的it示例