无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.
1.循环迭代实现
$arr = [
1=>[id=>1,name=>父1,father=>NULL],
2=>[id=>2,name=>父2,father=>NULL],
3=>[id=>3,name=>父3,father=>NULL],
4=>[id=>4,name=>儿1-1,father=>1],
5=>[id=>5,name=>儿1-2,father=>1],
6=>[id=>6,name=>儿1-3,father=>1],
7=>[id=>7,name=>儿2-1,father=>2],
8=>[id=>8,name=>儿2-1,father=>2],
9=>[id=>9,name=>儿3-1,father=>3],
10=>[id=>10,name=>儿3-1-1,father=>9],
11=>[id=>11,name=>儿1-1-1,father=>4],
12=>[id=>12,name=>儿2-1-1,father=>7],
];
function generateTree($items){
$tree = array();
foreach($items as $item){
if(isset($items[$item[father]])){
$items[$item[father]][son][] = &$items[$item[id]];
}else{
$tree[] = &$items[$item[id]];
}
}
return $tree;
}
$tree = generateTree($arr);
print_r(json_encode($tree));
输出:

分析:
这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.
优点:速度快,效率高.
缺点:数组的key值必须与id值相同,不便于取出数据(同样使用迭代获取数据)
2.递归实现
$arr = [
0=>[id=>1,name=>父1,father=>0],
1=>[id=>2,name=>父2,father=>0],
2=>[id=>3,name=>父3,father=>0],
3=>[id=>4,name=>儿1-1,father=>1],
4=>[id=>5,name=>儿1-2,father=>1],
5=>[id=>6,name=>儿1-3,father=>1],
6=>[id=>7,name=>儿2-1,father=>2],
7=>[id=>8,name=>儿2-1,father=>2],
8=>[id=>9,name=>儿3-1,father=>3],
9=>[id=>10,name=>儿3-1-1,father=>9],
10=>[id=>11,name=>儿1-1-1,father=>4],
11=>[id=>12,name=>儿2-1-1,father=>7],
];
function generateTree($arr,$id,$step){
static $tree=[];
foreach($arr as $key=>$val) {
if($val[father] == $id) {
$flg = str_repeat(└?,$step);
$val[name] = $flg.$val[name];
$tree[] = $val;
generateTree($arr , $val[id] ,$step+1);
}
}
return $tree;
}
$tree = generateTree($arr,0,0);
foreach ($tree as $val){
echo $val[name].<br>;
}
输出:

分析:
利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组
优点:方便遍历,查找父子元素
缺点:php不擅长递归,数据量大的情况下效率会显著降低
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持绿夏网。