PHP多层级菜单树形结构递归处理

如题:

一、数据库菜单数据表

使用图片中id和parent_id两个参数来关联父子关系

image

二、将数据库中的数据变成树状多层级解构

```
{
	"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;
```
以上即可完成菜单转化,重点是数据表中两个关联字段id、parent_id和递归函数;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值