PHP多层级菜单树形结构递归处理
如题:
一、数据库菜单数据表
使用图片中id和parent_id两个参数来关联父子关系
二、将数据库中的数据变成树状多层级解构
```
{
"id": 1,
"parentId": 0,
"treePath": "0",
"name": "系统管理",
"type": 2,
"path": "/system",
"component": "Layout",
"perm": null,
"visible": 1,
"sort": 1,
"icon": "system",
"redirect": "/system/user",
"createTime": "2021-08-28 09:12:21",
"updateTime": "2021-08-28 09:12:21",
"level": 0,
"children": [
{
"id": 2,
"parentId": 1,
"treePath": "0,1",
"name": "用户管理",
"type": 1,
"path": "user",
"component": "system/user/index",
"perm": null,
"visible": 1,
"sort": 1,
"icon": "user",
"redirect": null,
"createTime": "2021-08-28 09:12:21",
"updateTime": "2021-08-28 09:12:21",
"level": 1,
"children": [
{
"id": 31,
"parentId": 2,
"treePath": "0,1,2",
"name": "用户新增",
"type": 4,
"path": "",
"component": null,
"perm": "sys:user:add",
"visible": 1,
"sort": 1,
"icon": "",
"redirect": "",
"createTime": "2022-10-23 11:04:08",
"updateTime": "2022-10-23 11:04:11",
"level": 2
},
...
// 多层级省略
]
},
...
// 多层级省略
]
},
...
// 多层级省略
```
三、实现方法
```
// 1、先获取数据
$model = new SysMenu();
$data = $model->getDbAll();
// 2、重点: 组装菜单menus,可将该方法提取出来
function filterMenus($data, $pid = 0, $level = 0)
{
// $level 是可选
$tree = [];
foreach($data as $k => $v) {
if ($v['parent_id'] === $pid) {
$v['level'] = $level;
$child = filterMenus($data, $v['id'], $level+1);
if (!empty($child)) {
// 自定义children字段,存放子数据
$v['children'] = $child;
}
// 将$v push到$tree中,多维数组
$tree[] = $v;
}
}
return $tree;
}
// 3、调用函数
$menus = filterMenus($data, 0);
// 4、打印结果
var_dump($menus);die;
```