无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.
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不擅长递归,数据量大的情况下效率会显著降低
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。