1、一张表中有id,pid,name三个字段。用来表示无限级联动。pid表示父级id。如无父级,则pid为0。现已将表中数据全部查出,请封装函数,实现将该数据转换成树状结构。原始数据:
$menu_datas = [
[
'id' => 1,
'pid' => 0,
'name' => '菜单1'
],
[
'id' => 2,
'pid' => 0,
'name' => '菜单2'
],
[
'id' => 3,
'pid' => 1,
'name' => '菜单1下子菜单-1'
],
[
'id' => 4,
'pid' => 2,
'name' => '菜单2下子菜单-1'
],
[
'id' => 5,
'pid' => 2,
'name' => '菜单2下子菜单-2'
],
[
'id' => 6,
'pid' => 3,
'name' => '菜单1下子菜单-子菜单'
]
];
组装后格式:
[
[
'id' => 1,
'pid' => 0,
'name' => '菜单1'
'child' => [
[
'id' => 3,
'pid' => 1,
'name' => '菜单1下子菜单-1',
'child' => [
[
'id' => 6,
'pid' => 3,
'name' => '菜单1下子菜单-子菜单',
'child' => []
]
]
]
]
],
[
'id' => 2,
'pid' => 0,
'name' => '菜单2',
'child' => [
[
'id' => 4,
'pid' => 2,
'name' => '菜单2下子菜单-1',
'child' => []
],
[
'id' => 5,
'pid' => 2,
'name' => '菜单2下子菜单-2',
'child' => []
]
]
]
]
我的解答方案:
<?php
$menu_datas = [
[
'id' => 1,
'pid' => 0,
'name' => '菜单1'
],
[
'id' => 2,
'pid' => 0,
'name' => '菜单2'
],
[
'id' => 3,
'pid' => 1,
'name' => '菜单1下子菜单-1'
],
[
'id' => 4,
'pid' => 2,
'name' => '菜单2下子菜单-1'
],
[
'id' => 5,
'pid' => 2,
'name' => '菜单2下子菜单-2'
],
[
'id' => 6,
'pid' => 3,
'name' => '菜单1下子菜单-子菜单'
]
];
function get_tree_menu($parent_menu_datas, $menu_datas) {
$tree_menu = [];
foreach($parent_menu_datas as $parent_menu_key => $parent_menu_val) {
// 获取菜单ID
$parent_menu_id = $parent_menu_val['id'];
$tree_menu[$parent_menu_key] = $parent_menu_val;
// 寻找指定菜单ID的下一级菜单的所有数据内容
$next_level_menus = [];
foreach($menu_datas as $next_level_menu) {
if($next_level_menu['pid'] == $parent_menu_id) {
$next_level_menus[] = $next_level_menu;
}
}
if(!empty($next_level_menus)) {
$tree_menu[$parent_menu_key]['child'] = get_tree_menu($next_level_menus, $menu_datas);
} else {
$tree_menu[$parent_menu_key]['child'] = [];
}
}
return $tree_menu;
}
$first_level_datas = [];
foreach($menu_datas as $menu_data) {
if($menu_data['pid'] == 0) {
array_push($first_level_datas, $menu_data);
}
}
// print_r($first_level_datas);
$result = get_tree_menu($first_level_datas, $menu_datas);
print_r($result);
?>