PHP简单的以递归获取菜单树,返回多维数组
数据结构
<?php
$data = [
['id' => 1, 'name' => '顶级菜单0', 'parent_id' => 0],
['id' => 2, 'name' => '顶级菜单1', 'parent_id' => 0],
['id' => 3, 'name' => '二级菜单0', 'parent_id' => 1],
['id' => 4, 'name' => '二级菜单1', 'parent_id' => 1],
['id' => 5, 'name' => '二级菜单2', 'parent_id' => 1],
['id' => 6, 'name' => '二级菜单3', 'parent_id' => 2],
['id' => 7, 'name' => '二级菜单4', 'parent_id' => 2],
['id' => 8, 'name' => '三级菜单0', 'parent_id' => 6],
['id' => 9, 'name' => '三级菜单1', 'parent_id' => 3],
];
入口
首先入口方法,先记录 parent_id =0 的顶层菜单树根
<?php
public function getMenuTree()
{ $parent_id = []; foreach ($data as $key => $value) { if ($value['parent_id'] === 0) { $parent_id[$key] = $value; } } $all_node_lists = setMenuTree($parent_id, $data); //用于检测是否有子菜单 return $all_node_lists;
}
递归
递归所有子菜单,并复制到children上面进行记录
<?php
public function setMenuTree(array $data = [], array $all_data = [])
{
foreach ($data as $data_key => $data_value) {
$children = [];
foreach ($all_data as $all_data_key => $all_data_value) {
if ($all_data_value['parent_id'] == $data_value['id']) {
$children[] = $all_data_value;
}
}
if (count($children) > 0) {
$this->setMenuTree($children, $all_data);
$data[$data_key]['children'] = $children;
}
}
return $data;
}
返回
返回一个多维的跟类型数组
Array ( [0] => Array ( [id] => 1 [name] => 顶级菜单0 [parent_id] => 0 [children] => Array ( [0] => Array ( [id] => 3 [name] => 二级菜单0 [parent_id] => 1 [children] => Array ( [0] => Array ( [id] => 9 [name] => 三级菜单1 [parent_id] => 3 ) ) ) [1] => Array ( [id] => 4 [name] => 二级菜单1 [parent_id] => 1 ) [2] => Array ( [id] => 5 [name] => 二级菜单2 [parent_id] => 1 ) ) ) [1] => Array ( [id] => 2 [name] => 顶级菜单1 [parent_id] => 0 [children] => Array ( [0] => Array ( [id] => 6 [name] => 二级菜单3 [parent_id] => 2 [children] => Array ( [0] => Array ( [id] => 8 [name] => 三级菜单0 [parent_id] => 6 ) ) ) [1] => Array ( [id] => 7 [name] => 二级菜单4 [parent_id] => 2 ) ) ) )

浙公网安备 33010602011771号