PHP无限极分类函数的实现方法详解


Posted in PHP onApril 15, 2017

本文实例讲述了PHP无限极分类函数的实现方法。分享给大家供大家参考,具体如下:

在开发程序的时候,有时候,我们需要获取所有栏目(包括一级栏目、二级栏目、三级栏目等等),并按照父子关系形成树型结构。可以采取使用递归或者通过引用方式(php中引用类似C或者C++中的指针,只不过换一种说法而已)。

通过引用方式实现无限极分类

思路:

1.即所有待处理的数据进行包装成下标为主键id(pk)的数组,便于有pid获取对应的父栏目。

2.对包装的数据进行循环,如果为根节点,则将其引用添加到tree中,否则,将其引用添加到其父类的子元素中。这样虽然tree中,只是添加了根节点,但是每个根节点如果有子元素,其中包含了子元素的引用。故能形成树型。

代码如下

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pk 自增字段(栏目id)
 * @param string $pid parent标记字段
 * @return array
 * @author dqs <1696232133@qq.com>
 */
function make_tree($list,$pk='id',$pid='pid',$child='_child',$root=0){
  $tree=array();
  $packData=array();
  foreach ($list as $data) {
    $packData[$data[$pk]] = $data;
  }
  foreach ($packData as $key =>$val){
    if($val[$pid]==$root){//代表跟节点
      $tree[]=& $packData[$key];
    }else{
      //找到其父类
      $packData[$val[$pid]][$child][]=& $packData[$key];
    }
  }
  return $tree;
}

数据结构如下:

PHP无限极分类函数的实现方法详解

执行结果如下

Array
(
  [0] => Array
    (
      [id] => 6
      [pid] => 0
      [title] => 测试1
      [url] => test1
      [sort] => 0
      [create_time] => 1464076199
      [update_time] => 1464076199
      [status] => 1
      [target] => 0
    )
  [1] => Array
    (
      [id] => 7
      [pid] => 0
      [title] => 测试2
      [url] => test2
      [sort] => 0
      [create_time] => 1464076218
      [update_time] => 1464076218
      [status] => 1
      [target] => 0
    )
  [2] => Array
    (
      [id] => 1
      [pid] => 0
      [title] => 首页
      [url] => Index/index
      [sort] => 1
      [create_time] => 1379475111
      [update_time] => 1379923177
      [status] => 1
      [target] => 0
    )
  [3] => Array
    (
      [id] => 2
      [pid] => 0
      [title] => 博客
      [url] => Article/index?category=blog
      [sort] => 2
      [create_time] => 1379475131
      [update_time] => 1379483713
      [status] => 1
      [target] => 0
      [_child] => Array
        (
          [0] => Array
            (
              [id] => 4
              [pid] => 2
              [title] => 个人博客
              [url] => ownblog
              [sort] => 0
              [create_time] => 1464075558
              [update_time] => 1464075558
              [status] => 1
              [target] => 0
              [_child] => Array
                (
                  [0] => Array
                    (
                      [id] => 8
                      [pid] => 4
                      [title] => 新浪博客
                      [url] => sinaBlog
                      [sort] => 0
                      [create_time] => 1464077276
                      [update_time] => 1464077276
                      [status] => 1
                      [target] => 0
                    )
                )
            )
          [1] => Array
            (
              [id] => 5
              [pid] => 2
              [title] => 他人博客
              [url] => otherBlog
              [sort] => 0
              [create_time] => 1464075582
              [update_time] => 1464075582
              [status] => 1
              [target] => 0
            )
        )
    )
  [4] => Array
    (
      [id] => 3
      [pid] => 0
      [title] => 官网
      [url] => http://www.onethink.cn
      [sort] => 3
      [create_time] => 1379475154
      [update_time] => 1387163458
      [status] => 1
      [target] => 0
    )
)

附加OneThink中无限极分类函数

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
  // 创建Tree
  $tree = array();
  if(is_array($list)) {
    // 创建基于主键的数组引用
    $refer = array();
    foreach ($list as $key => $data) {
      $refer[$data[$pk]] =& $list[$key];
    }
    foreach ($list as $key => $data) {
      // 判断是否存在parent
      $parentId = $data[$pid];
      if ($root == $parentId) {
        $tree[] =& $list[$key];
      }else{
        if (isset($refer[$parentId])) {
          $parent =& $refer[$parentId];
          $parent[$child][] =& $list[$key];
        }
      }
    }
  }
  return $tree;
}

通过递归方式实现无限极分类

思路:

1.使用循环,分别获取所有的根节点。

2.在获取每个节点的时候,将该节点从原数据中移除,并递归方式获取其所有的子节点,一直原数据为空。

代码实现如下:

function make_tree1($list,$pk='id',$pid='pid',$child='_child',$root=0){
  $tree=array();
  foreach($list as $key=> $val){
    if($val[$pid]==$root){
      //获取当前$pid所有子类
        unset($list[$key]);
        if(! empty($list)){
          $child=make_tree1($list,$pk,$pid,$child,$val[$pk]);
          if(!empty($child)){
            $val['_child']=$child;
          }
        }
        $tree[]=$val;
    }
  }
  return $tree;
}

效果截图如下:

PHP无限极分类函数的实现方法详解

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 全文搜索和替换的实现代码
Jul 29 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
PHP中trait使用方法详细介绍
May 21 PHP
php使用curl下载指定大小的文件实例代码
Sep 30 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
PHP实现通过文本文件统计页面访问量功能示例
Feb 13 PHP
在laravel中实现事务回滚的方法
Oct 10 PHP
php实现JWT验证的实例教程
Nov 26 PHP
基于ThinkPHP实现的日历功能实例详解
Apr 15 #PHP
php修改数组键名的方法示例
Apr 15 #PHP
php自定义函数实现统计中文字符串长度的方法小结
Apr 15 #PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 #PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
Apr 15 #PHP
PHP快速推送微信模板消息
Apr 14 #PHP
PHP 中常量的知识整理
Apr 14 #PHP
You might like
十天学会php之第十天
2006/10/09 PHP
PHP下对数组进行排序的函数
2010/08/08 PHP
php常用的安全过滤函数集锦
2014/10/09 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
js+html5实现canvas绘制镂空字体文本的方法
2015/06/05 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python通过select实现异步IO的方法
2015/06/04 Python
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python读大数据txt
2016/03/28 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
初中生三年学习生活的自我评价
2013/11/03 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
项目建议书
2015/02/04 职场文书
雨花台导游词
2015/02/06 职场文书
涨价通知怎么写
2015/04/23 职场文书
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers