无限极 php算法,无限极分类算法,对你一定有帮助

a336c592a49c65519186b087e8d83557.png

无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极分类算法进行总结归纳,其实大多数就是迭代与递归。

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));

输出:

12aba866b0045cc728fd82dd4ac8bedf.png

分析:

这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.

优点:速度快,效率高.

缺点:数组的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'].'
';

}

输出

d75919e3c3ddd6d9b648839d21b8e381.png

分析:

利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组

优点:方便遍历,查找父子元素

缺点:php不擅长递归,数据量大的情况下效率会显著降低

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值