php实现无限极分类算法,PHP无限极分类函数的实现方法实例详解
这篇文章主要介绍了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无限极分类函数的实现方法实例详解相关推荐
- php mysql无限_php+mysql实现无限分类实例详解
php+mysql实现无限分类实例详解 fenlei($arr[$i][0]); //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...
- 分类算法列一下有多少种?应用场景?分类算法介绍、常见分类算法优缺点、如何选择分类算法、分类算法评估
分类算法 分类算法介绍 概念 分类算法 常见分类算法 NBS LR SVM算法 ID3算法 C4.5 算法 C5.0算法 KNN 算法 ANN 算法 选择分类算法 分类算法性能评估 分类算法介绍 概念 ...
- abaqus实例详解_Abaqus接触分类、形成和定义
接触概述 从物理意义上来讲,两个物体彼此接触,接触压力在两个物体间传递,同时,接触面之间摩擦产生剪切应力,阻止物体切向运动:从数值计算上来讲,接触是极其不连续的边界条件非线性,即接触面接触时产生接触约 ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解
java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...
- python如何调用文件进行换位加密_python 换位密码算法的实例详解
python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...
- html5走格子游戏,JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解 发布时间:2020-09-26 20:42:24 来源:脚本之家 阅读:112 作者:krapnik 本文实例讲述了JS/HTML5游戏常 ...
- 冒泡排序算法实例详解
冒泡排序算法实例详解 1.复杂度与稳定性 算法时间复杂度 最坏情况:O(n^2) 最好情况:O(n) 平均情况:O(n^2) 空间复杂度:S(n)=O(1) 稳定性:稳定排序 2.过程介绍(以顺序为例 ...
- php mysql 分类_php+mysql实现无限分类实例详解
本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行 ...
最新文章
- 【Qt】Qt再学习(十六):QObject::connect: Cannot queue arguments of type ‘QString‘
- 安全攻防技能——Web安全——XSS
- DIV层跟随鼠标位置显示提示
- [html] img中的src加载失败时如何用默认图片来替换呢?
- (JAVA)CollectionDemo3
- 动态规划经典题之编辑距离
- 记一次ajax交互问题
- uploadify 3.2 后台动态传参数
- spring boot错误: 找不到或无法加载主类
- python爬取音乐_Python现学现用xpath爬取豆瓣音乐
- js/jquery 获取本地文件的文件路劲 获取input框中type=‘file’ 中的文件路径(转载)...
- 用户id oracle设置,Oracle中的架构,用户和功能ID
- memcached—向memcached中保存Java实体需注意的问题
- 去重仅保留一条_重庆磁器口只是一条商业街?看过它的发展历史,你就不会这么想了...
- paxos算法java实现_Paxos算法——前世
- UPS 笔记 (逆变电源 DSP)
- 【TensorFlow】DNNRegressor 的简单使用
- 什么是FDR校正,核磁共振成像中FDR校正方法有哪些?如何进行FDR校正?
- java编程中的di是什么_Diboot
- VS2019即将完成…一切即将准备就绪