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与SQL注入攻击[三]
Apr 17 PHP
PHP 彩色文字实现代码
Jun 29 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
php导入导出excel实例
Oct 25 PHP
php四种基础算法代码实例
Oct 29 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
PHP中的一些常用函数收集
May 26 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 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使用pack处理二进制文件的方法
2014/07/03 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
python遍历小写英文字母的方法
2019/01/02 Python
python三引号输出方法
2019/02/27 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
计算机应用专业推荐信
2013/11/13 职场文书
五一家具促销方案
2014/01/10 职场文书
见习期自我鉴定
2014/01/31 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
学生会部长竞聘书
2014/03/31 职场文书
公司合并协议书范本
2014/09/30 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
如何用threejs实现实时多边形折射
2021/05/07 Javascript