无限极分类算法,对你一定有帮助
无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极算法" title="分类算法">分类算法进行总结归纳,其实大多数就是迭代与递归。
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不擅长递归,数据量大的情况下效率会显著降低
以上是 无限极分类算法,对你一定有帮助 的全部内容, 来源链接: utcz.com/z/517923.html