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中的 == 运算符进行字符串比较
Nov 26 PHP
php 中文处理函数集合
Aug 27 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
PHP 魔术函数使用说明
May 14 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
smarty简单应用实例
Nov 03 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
Sep 11 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 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
基于PHP的加载类操作以及其他两种魔术方法的应用实例
Aug 28 #PHP
You might like
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
在微信小程序中保存网络图片
2019/02/12 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
Python过滤txt文件内重复内容的方法
2018/10/21 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
django实现模型字段动态choice的操作
2020/04/01 Python
python中如何写类
2020/06/29 Python
Keras搭建自编码器操作
2020/07/03 Python
现代化办公人员工作的自我评价
2013/10/16 职场文书
战略合作意向书范本
2014/04/01 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
商家认证委托书格式
2014/10/16 职场文书
普通党员个人整改措施
2014/10/27 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
vue3获取当前路由地址
2022/02/18 Vue.js
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL