今天突然想用到这个功能 结果百度到的 基本是写乱糟糟的一堆代码 无奈只好亲自操刀
话不多说,先上代码:
class Tools{ public static function listToTree($data,$pid = 0){ $arr = array_filter($data,function ($v) use ($pid){ if($pid == $v['pid']){ return true; } return false; }); $arr = array_values($arr); $tools = __CLASS__ ; $res = array_map(function ($v) use ($data,$tools){ $v['children'] = $tools::listToTree($data,$v['id']); return $v; },$arr); return $res; } }
测试数据如下:
$list = [ { "id": 1, "notice": "订单管理", "level": 1, "pid": 0, "path": "-1" }, { "id": 2, "notice": "产品管理", "level": 1, "pid": 0, "path": "-2" }, { "id": 3, "notice": "权限管理", "level": 1, "pid": 0, "path": "-3" }, { "id": 4, "notice": "订单列表", "level": 2, "pid": 1, "path": "-1-4" }, { "id": 5, "notice": "退款管理", "level": 2, "pid": 1, "path": "-1-5" }, { "id": 6, "notice": "产品列表", "level": 2, "pid": 2, "path": "-2-6" }, { "id": 7, "notice": "产品分类", "level": 2, "pid": 2, "path": "-2-7" }, { "id": 8, "notice": "用户管理", "level": 2, "pid": 3, "path": "-3-8" }, { "id": 9, "notice": "角色管理", "level": 2, "pid": 3, "path": "-3-9" }, { "id": 10, "notice": "菜单管理", "level": 2, "pid": 3, "path": "-3-10" } ]; var_dump(Tools::listToTree($list));
结果:
[ { "id": 1, "notice": "订单管理", "level": 1, "pid": 0, "path": "-1", "children": [ { "id": 4, "notice": "订单列表", "level": 2, "pid": 1, "path": "-1-4", "children": [] }, { "id": 5, "notice": "退款管理", "level": 2, "pid": 1, "path": "-1-5", "children": [] } ] }, { "id": 2, "notice": "产品管理", "level": 1, "pid": 0, "path": "-2", "children": [ { "id": 6, "notice": "产品列表", "level": 2, "pid": 2, "path": "-2-6", "children": [] }, { "id": 7, "notice": "产品分类", "level": 2, "pid": 2, "path": "-2-7", "children": [] } ] }, { "id": 3, "notice": "权限管理", "level": 1, "pid": 0, "path": "-3", "children": [ { "id": 8, "notice": "用户管理", "level": 2, "pid": 3, "path": "-3-8", "children": [] }, { "id": 9, "notice": "角色管理", "level": 2, "pid": 3, "path": "-3-9", "children": [] }, { "id": 10, "notice": "菜单管理", "level": 2, "pid": 3, "path": "-3-10", "children": [] } ] } ]