前言
咱们在开发的过程当中,一定会遇到需要将一组数据处理为树形结构返回给前端,或者是需要这样的树形结构。
需要处理的数据结构
[
{
"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
}
]
处理完以后的数据
[
{
"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
}
]
}
]
代码实现
主要代码
/**
* 菜单树形获取
* @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;
}
使用
$list = []; // 需要处理的数据
$tree = self::toTree($list, 0);
return $tree;
小结
- 如果是处理较多的数据,大家可以使用缓存来配合开发。
- 菜单,地区,分类等都可以使用此方法。