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模板,主要想体现一下思路
Dec 25 PHP
PHP 面向对象详解
Sep 13 PHP
php配置php-fpm启动参数及配置详解
Nov 04 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
php图片的二进制转换实现方法
Dec 15 PHP
浅谈PHP接收POST数据方式
Jun 05 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
用php定义一个数组最简单的方法
Oct 04 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 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 将excel导入mysql
2009/11/09 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
实例解析php的数据类型
2018/10/24 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
python中dict使用方法详解
2019/07/17 Python
一行python实现树形结构的方法
2019/08/09 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
python中操作文件的模块的方法总结
2021/02/04 Python
eBay加拿大站:eBay.ca
2019/06/20 全球购物
init进程的作用
2012/04/12 面试题
中式餐厅创业计划书范文
2014/01/23 职场文书
学习心理学的体会
2014/11/07 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python