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实现jQuery扩展函数
Oct 30 PHP
php下删除一篇文章生成的多个静态页面
Aug 08 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
php中的观察者模式简单实例
Jan 20 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
PDO::beginTransaction讲解
Jan 27 PHP
Laravel框架查询构造器简单示例
May 08 PHP
PHP大文件分块上传功能实例详解
Jul 22 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.ini 中文版
2006/10/28 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
python爬取微信公众号文章
2018/08/31 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
高三自我鉴定
2013/10/23 职场文书
项目建议书怎么写
2014/05/15 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
党员个人剖析材料
2014/09/30 职场文书
全国助残日活动总结
2015/05/11 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
css3应用示例:新增的选择器
2022/03/16 HTML / CSS