Shadow
PHP生成无限级菜单
生成无限级菜单 O(n) —— 只遍历数据 两次(建 map + 挂载),每次 O(1) 查父节点 ,pid为父id,关系
直接上代码:
/**
* 生成无限级菜单 O(n) —— 只遍历数据 两次(建 map + 挂载),每次 O(1) 查父节点 ,pid为父id,关系
* @return void
*/
public function index()
{
//基础数据
$baseData = [
['id' => 1, 'pid' => 0, 'name' => 'a1'],
['id' => 2, 'pid' => 1, 'name' => 'a2'],
['id' => 3, 'pid' => 1, 'name' => 'a3'],
['id' => 4, 'pid' => 2, 'name' => 'a4'],
['id' => 5, 'pid' => 3, 'name' => 'a5'],
['id' => 6, 'pid' => 3, 'name' => 'a6'],
['id' => 7, 'pid' => 0, 'name' => 'B1'],
];
//map建立哈希映射,根据id保存数据
$nodeMap = [];
foreach ($baseData as $data) {
$nodeMap[$data['id']] = $data;
$nodeMap[$data['id']]['child'] = [];
}
//树形数据
$tree = [];
//处理map数据,需要用&引用数据的方式
foreach ($nodeMap as &$data) {
if ($data['pid'] == 0) {
//当没有上级直接添加到树形结构
$tree[] = &$data;
} else {
//存在pid的时候再放到父级的child字段中
if ($data['pid'] && isset($nodeMap[$data['pid']])) {
$nodeMap[$data['pid']]['child'][] = &$data;
}
}
}
//打印数据结构
dd($tree);
} Dcr163的博客
http://dcr163.cn/772.html(转载时请注明本文出处及文章链接)
