foreword
In the process of development, we will definitely encounter the need to process a set of data into a tree structure and return it to the front end, or we need such a tree structure.
The data structures that need to be processed
[
{
"admin_menu_id": 396,
"menu_pid": 0,
"menu_name": "欢迎",
"menu_url": "admin/CommonData/list",
"menu_sort": 400,
"is_menu": 1
},
{
"admin_menu_id": 1,
"menu_pid": 0,
"menu_name": "控制台",
"menu_url": "",
"menu_sort": 300,
"is_menu": 0
},
{
"admin_menu_id": 49,
"menu_pid": 1,
"menu_name": "首页",
"menu_url": "admin/AdminIndex/index",
"menu_sort": 200,
"is_menu": 0
},
{
"admin_menu_id": 172,
"menu_pid": 1,
"menu_name": "会员统计",
"menu_url": "admin/AdminIndex/member",
"menu_sort": 200,
"is_menu": 0
}
]
Data after processing
[
{
"admin_menu_id": 396,
"menu_pid": 0,
"menu_name": "欢迎",
"menu_url": "admin/CommonData/list",
"menu_sort": 400,
"is_menu": 1
},
{
"admin_menu_id": 1,
"menu_pid": 0,
"menu_name": "控制台",
"menu_url": "",
"menu_sort": 300,
"is_menu": 0,
"children": [
{
"admin_menu_id": 49,
"menu_pid": 1,
"menu_name": "首页",
"menu_url": "admin/AdminIndex/index",
"menu_sort": 200,
"is_menu": 0
},
{
"admin_menu_id": 172,
"menu_pid": 1,
"menu_name": "会员统计",
"menu_url": "admin/AdminIndex/member",
"menu_sort": 200,
"is_menu": 0
}
]
}
]
Code
main code
/**
* 菜单树形获取
* @param array $admin_menu 所有菜单
* @param integer $menu_pid 菜单父级id
* @return array
*/
public static function toTree($admin_menu, $menu_pid)
{
$tree = [];
foreach ($admin_menu as $k => $v) {
if ($v['menu_pid'] == $menu_pid) {
$childData = self::toTree($admin_menu, $v['admin_menu_id']);
// 这里根据前端,以及业务的需要来处理,加上这个判断,如果该菜单没有下级,就没有chlidren字段,不加判断,则返回[]
if (count($childData) > 0) {
$v['children'] = self::toTree($admin_menu, $v['admin_menu_id']);
}
$tree[] = $v;
}
}
return $tree;
}
use
$list = []; // 需要处理的数据
$tree = self::toTree($list, 0);
return $tree;
summary
- If you are dealing with a lot of data, you can use the cache to cooperate with the development.
- This method can be used for menus, regions, categories, etc.