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实现ODBC数据分页显示一例
Oct 09 PHP
php 上传文件类型判断函数(避免上传漏洞 )
Jun 08 PHP
discuz的php防止sql注入函数
Jan 17 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php接口与接口引用的深入解析
Aug 09 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
php socket通信简单实现
Nov 18 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
实例讲解php将字符串输出到HTML
Jan 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逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
最大K个数问题的Python版解法总结
2016/06/16 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
深入浅析python 中的匿名函数
2018/05/21 Python
python中threading开启关闭线程操作
2020/05/02 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
人事行政主管岗位职责
2013/12/22 职场文书
餐饮营销方案
2014/02/23 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android