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扩展ZF――Validate扩展
Jan 10 PHP
PHP 抓取网页图片并且另存为的实现代码
Mar 24 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
php学习笔记之 函数声明
Jun 09 PHP
关于PHPDocument 代码注释规范的总结
Jun 25 PHP
php MessagePack介绍
Oct 06 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 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验证码(支持中文)
2007/02/14 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
yii2安装详细流程
2018/05/23 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
Python实现的归并排序算法示例
2017/11/21 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
生物专业个人自荐信范文
2013/11/29 职场文书
房屋租赁协议书
2014/04/10 职场文书
小学生手册家长评语
2014/04/16 职场文书
廉洁校园实施方案
2014/05/25 职场文书
美术课外活动总结
2014/07/08 职场文书
自主招生英文自荐信
2015/03/25 职场文书
活动费用申请报告
2015/05/15 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL