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中simplexml_load_string函数使用说明
Jan 01 PHP
PHP插入排序实现代码
Apr 04 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
php学习笔记之基础知识
Nov 08 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
php多文件打包下载的实例代码
Jul 12 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
PHP聊天室简单实现方法详解
Dec 08 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
Sep 29 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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加密解密函数authcode的用法详细解析
2013/10/28 PHP
php实现encode64编码类实例
2015/03/24 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
javascript textContent与innerText的异同分析
2010/10/22 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
js获取Get值的方法
2016/09/29 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
使用jQuery实现购物车结算功能
2017/08/15 jQuery
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
python中的字典操作及字典函数
2018/01/03 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
python如何调用字典的key
2020/05/25 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
python中四舍五入的正确打开方式
2021/01/18 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
大学生如何写自荐信
2014/01/08 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
广告传媒专业应届生求职信
2014/03/01 职场文书
学前班评语大全
2014/05/04 职场文书
技术经济专业求职信
2014/09/03 职场文书
募捐感谢信
2015/01/22 职场文书
小学美术教学反思
2016/02/17 职场文书