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 相关文章推荐
Access数据库导入Mysql的方法之一
Oct 09 PHP
教你如何把一篇文章按要求分段
Oct 09 PHP
PHP 文件类型判断代码
Mar 13 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
php判断linux下程序问题实例
Jul 09 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
PHP大文件切割上传功能实例分析
Jul 01 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
laravel 验证错误信息到 blade模板的方法
Sep 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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
初级的用php写的采集程序
2007/03/16 PHP
smarty中js的调用方法示例
2014/10/27 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP会话处理的10个函数
2015/08/11 PHP
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Python新手们容易犯的几个错误总结
2017/04/01 Python
python 接口返回的json字符串实例
2018/03/27 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
简述python Scrapy框架
2020/08/17 Python
Python wordcloud库安装方法总结
2020/12/31 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
教师自我鉴定
2013/12/13 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
合伙经营协议书范本
2014/09/13 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
Python实现打乒乓小游戏
2021/09/25 Python
灵能百分百第三季什么时候来?
2022/03/15 日漫
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android