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 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
php实现微信公众号无限群发
Oct 11 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
PHP发送AT指令实例代码
May 26 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
php curl优化下载微信头像的方法总结
Sep 07 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
JSON 数据格式详解
2017/09/13 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
解决python flask中config配置管理的问题
2019/07/26 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
经理职责范文
2013/11/08 职场文书
电子商务专业推荐信范文
2013/12/02 职场文书
《学会待客》教学反思
2014/02/22 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
安全保证书格式
2015/02/28 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL