在开始之前,先来了解一下什么是地址引用。
php的引用,就是在变量、函数、对象等前面加上&符号,意思是使用不同的变量访问同一个变量内容。
下图来帮助大家理解下引用的作用
接下来进入正题
首先,创建数据
CREATE TABLE `menus` (
`menu_id` INT(11) NOT NULL AUTO_INCREMENT,
`title` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
`parent_id` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`menu_id`) USING BTREE
)
COMMENT='菜单'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=23
;
INSERT INTO `menus` (`menu_id`, `title`, `parent_id`) VALUES
(1, '编程语言', 0),
(2, '数据库', 0),
(3, '前端', 1),
(4, '后端', 1),
(5, 'sql', 2),
(6, 'nosql', 2),
(7, 'js', 3),
(8, 'css', 3),
(9, 'html', 3),
(10, 'vue', 3),
(11, 'java', 4),
(12, 'c++', 4),
(13, 'php', 4),
(14, 'go', 4),
(15, 'mysql', 5),
(16, 'oracle', 5),
(17, 'sqlite', 5),
(18, 'sqlserver', 5),
(19, 'redis', 6),
(20, 'mongodb', 6),
(21, 'elasticsearch', 6);
其次,处理成树状结构的菜单
第一步,获取全部菜单
# 全部数据
$menuList = \Database\MenuModel::query()->get()->toArray();
第二步,新建一个$tree,用来存储$menuList的每行数据的引用
$tree = [];
foreach ($menuList as $key => $value) {
$tree[$value['menu_id']] = &$menuList[$key];
}
第三步,遍历$menuList,将每行数据放置到对应的父级菜单下
foreach ($menuList as $key => $value) {
$parent = &$tree[$value['parent_id']];
$parent['children'][] = &$menuList[$key];
}
到此为止,$menuList 里面的每行数据,都包含了其下面所有的子菜单
第四步,获取指定级别的菜单
$parentId = 0;
$return = [];
foreach ($menuList as $key => $value) {
if($value['parent_id'] == $parentId) {
array_push($return, $value);
}
}
$parentId = 0 表示获取顶级菜单及其树状的子菜单
最终结果如下