PHP menu tree processing

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.

Guess you like

Origin blog.csdn.net/qq_43106047/article/details/124626370