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

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

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