PHP迭代与递归实现无限级分类


Posted in PHP onAugust 28, 2017

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

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

输出:

PHP迭代与递归实现无限级分类

分析:

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

优点:速度快,效率高.

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

 输出:

PHP迭代与递归实现无限级分类

分析:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 高手之路(二)
Oct 09 PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 PHP
php生成网页桌面快捷方式
May 05 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
零基础php编程好学吗
Oct 11 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
PHP number_format函数原理及实例解析
Jul 14 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 #PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 #PHP
php检查函数必传参数是否存在的实例详解
Aug 28 #PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 #PHP
You might like
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
利用php实现禁用IE和火狐的缓存问题
2012/12/03 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
JS函数本身的作用域实例分析
2020/03/16 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
html5使用canvas画三角形
2014/12/15 HTML / CSS
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
个人求职简历中英文自我评价
2013/12/16 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
《悯农》教学反思
2014/04/28 职场文书
学生安全承诺书
2014/05/22 职场文书
关于保护环境的建议书
2014/08/26 职场文书
滞留工资返还协议书
2014/10/19 职场文书
2015年元旦标语大全
2014/12/09 职场文书
邀请函模板
2015/02/02 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书