$list = [
['id'=>'222', 'name'=>'李世民', 'parentid'=>'111'],
['id'=>'999', 'name'=>'李隆基', 'parentid'=>'777'],
['id'=>'111', 'name'=>'李渊', 'parentid'=>'0'],
['id'=>'555', 'name'=>'李治', 'parentid'=>'222'],
['id'=>'666', 'name'=>'李显', 'parentid'=>'555'],
['id'=>'777', 'name'=>'李旦', 'parentid'=>'555'],
['id'=>'444', 'name'=>'李建成', 'parentid'=>'111'],
['id'=>'333', 'name'=>'李元霸', 'parentid'=>'111'],
['id'=>'888', 'name'=>'李重茂', 'parentid'=>'666'],
];
$parentIds = [];
foreach ($list as $item){
$key = $item['parentid'];
$parentIds[$key][] = $item['id'];
}
$tree = createTreeData2($parentIds, $list);
print_r(json_encode($tree));die;
/**
* 创建树数据
*/
function createTreeData2($parentIds, &$list)
{
$res = [];
if(!$list){
return $res;
}
foreach ($parentIds as $parentId => $childIds){
//先查找 当前父类id是否存在 上级
$childrenNodes = array_filter($list, function ($item)use($parentId){
return $item['id'] == $parentId;
});
//如果存在 (一个子类不可能同时拥有两个父类, 所以 $childrenNodes是 单个元素)
if($childrenNodes){
$childrenNodes = array_shift($childrenNodes);
// 再查找 这个父类 是否 存在父类
$chs = array_filter($list, function ($item)use($parentId,$childrenNodes){
return $item['id'] == $childrenNodes['parentid'];
});
//如果不存在, 那么他就是最顶级了 (如果存在呢?)
if(!$chs){
$child = makeNode2($childrenNodes, $list);
if($child){
$childrenNodes['children'] = array_values($child);
}
array_push($res, $childrenNodes);
}
}else{
foreach ($childIds as $k => $v){
if(!isset($parentIds[$v])){
$tp = array_filter($list, function ($item)use($v){
return $item['id'] == $v;
});
$tp = array_shift($tp);
array_push($res, $tp);
}
}
}
}
return $res;
}
/**
* 构造单个节点
*/
function makeNode2($childrenNodes, &$list)
{
$childrens = array_filter($list, function ($item)use ($childrenNodes)
{
return $item['parentid'] == $childrenNodes['id']; }
);
if($childrens){
foreach ($childrens as $key => $children){
$child = makeNode2($children, $list);
if($child){
// $child = array_shift($child);
$childrens[$key]['children'] = array_values($child);
}
}
}
return $childrens;
}