引用式(性能更好)
- 引用式无限极分类
- 必须存在主键id 必须存在父级 pid
$data=[
['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'=>0,'name'=>'a5'],
];
function getTreeList($data){
$list=array_column($data,null,'id');
$tree=[];
foreach ($list as $k=>&$v){
$pid=$v['pid'];
//如果存在爸爸
if (isset($list[$pid])){
//将自己放到爸爸的儿子列表中,注意是引用类型,这个操作会同步修改其它引用了爸爸的数据,如tree结构,
//这个操作非常关键,也就是说你给爸爸添加了儿子,那么其它引用了爸爸($list[$pid])的数据一样会添加儿子,即tree结构会被同步修改
$list[$pid]['children'][]=&$v;
}else{
$tree[]=&$v;
}
}
return $tree;
}
递归式
递归的方式就不多说了,直接上代码,用心领会吧
function tree(&$list,$pid=0,$level=0,$html='  ')
{
static $tree = array();
foreach($list as $v){
if($v['pid'] == $pid){
$v['sort'] = $level;
$v['html'] = str_repeat($html,$level);
$tree[] = $v;
tree($list,$v['role_id'],$level+1);
}
}
return $tree;
}