php菜单树形处理

前言

咱们在开发的过程当中,一定会遇到需要将一组数据处理为树形结构返回给前端,或者是需要这样的树形结构。

需要处理的数据结构

[
    {
    
    
        "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;

小结

  • 如果是处理较多的数据,大家可以使用缓存来配合开发。
  • 菜单,地区,分类等都可以使用此方法。

猜你喜欢

转载自blog.csdn.net/qq_43106047/article/details/124626370