无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.

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不擅长递归,数据量大的情况下效率会显著降低

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。