这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路、实现代码与相关注意事项,需要的朋友可以参考下

本文实例讲述了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;

}

数据结构如下:

执行结果如下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 麦当苗儿

*/

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无限极分类函数的实现方法实例详解相关推荐

  1. php mysql无限_php+mysql实现无限分类实例详解

    php+mysql实现无限分类实例详解 fenlei($arr[$i][0]);   //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...

  2. 分类算法列一下有多少种?应用场景?分类算法介绍、常见分类算法优缺点、如何选择分类算法、分类算法评估

    分类算法 分类算法介绍 概念 分类算法 常见分类算法 NBS LR SVM算法 ID3算法 C4.5 算法 C5.0算法 KNN 算法 ANN 算法 选择分类算法 分类算法性能评估 分类算法介绍 概念 ...

  3. abaqus实例详解_Abaqus接触分类、形成和定义

    接触概述 从物理意义上来讲,两个物体彼此接触,接触压力在两个物体间传递,同时,接触面之间摩擦产生剪切应力,阻止物体切向运动:从数值计算上来讲,接触是极其不连续的边界条件非线性,即接触面接触时产生接触约 ...

  4. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  5. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  6. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  7. html5走格子游戏,JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解

    JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解 发布时间:2020-09-26 20:42:24 来源:脚本之家 阅读:112 作者:krapnik 本文实例讲述了JS/HTML5游戏常 ...

  8. 冒泡排序算法实例详解

    冒泡排序算法实例详解 1.复杂度与稳定性 算法时间复杂度 最坏情况:O(n^2) 最好情况:O(n) 平均情况:O(n^2) 空间复杂度:S(n)=O(1) 稳定性:稳定排序 2.过程介绍(以顺序为例 ...

  9. php mysql 分类_php+mysql实现无限分类实例详解

    本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行 ...

最新文章

  1. 【Qt】Qt再学习(十六):QObject::connect: Cannot queue arguments of type ‘QString‘
  2. 安全攻防技能——Web安全——XSS
  3. DIV层跟随鼠标位置显示提示
  4. [html] img中的src加载失败时如何用默认图片来替换呢?
  5. (JAVA)CollectionDemo3
  6. 动态规划经典题之编辑距离
  7. 记一次ajax交互问题
  8. uploadify 3.2 后台动态传参数
  9. spring boot错误: 找不到或无法加载主类
  10. python爬取音乐_Python现学现用xpath爬取豆瓣音乐
  11. js/jquery 获取本地文件的文件路劲 获取input框中type=‘file’ 中的文件路径(转载)...
  12. 用户id oracle设置,Oracle中的架构,用户和功能ID
  13. memcached—向memcached中保存Java实体需注意的问题
  14. 去重仅保留一条_重庆磁器口只是一条商业街?看过它的发展历史,你就不会这么想了...
  15. paxos算法java实现_Paxos算法——前世
  16. UPS 笔记 (逆变电源 DSP)
  17. 【TensorFlow】DNNRegressor 的简单使用
  18. 什么是FDR校正,核磁共振成像中FDR校正方法有哪些?如何进行FDR校正?
  19. java编程中的di是什么_Diboot
  20. VS2019即将完成…一切即将准备就绪

热门文章

  1. centos7安装tomcat步骤
  2. 三步解决mybatis-plus逻辑删除
  3. 两张电梯卡到期时间是哪天?哪种加密方法?
  4. 机器学习的数学基础(5):最小均方误差的回归问题
  5. android native ALooper AHandler
  6. LLCC68低功耗Sub-GHz LoRa射频收发器LLCC68IMLTRT
  7. protocal-buffers C++基础
  8. 数据孪生景区三维实景实现了“足不出户游天下”
  9. 《游戏系统设计十五》游戏房间服的设计
  10. Windows下6种IO模型