php递归获取分类结构
商城的菜单通常都是树状结构,我们来模仿实现以下。
原理都是相同的,所以我们来个简单点的结构就行。层级只有两层,有两大类:手机和电脑;每个大类下面分别有三个子类:
//从数据库获取的分类数据(省略获取步骤)
//有“手机”和“电脑”两个大类
//--手机{三星Glaxy,IphoneX,华为荣耀}
//--电脑{Dell,Lenovo,IBM} $data = array( array('id' => 5, 'name' => '电脑', 'pid' => 0),
array('id' => 1, 'name' => '手机', 'pid' => 0),
array('id' => 2, 'name' => '三星Glaxy', 'pid' => 1),
array('id' => 3, 'name' => 'IphoneX', 'pid' => 1),
array('id' => 4, 'name' => '华为荣耀', 'pid' => 1),
array('id' => 6, 'name' => 'Dell', 'pid' => 5),
array('id' => 7, 'name' => 'Lenovo', 'pid' => 5),
array('id' => 8, 'name' => 'IBM', 'pid' => 5),
);
这种查子类当然是递归走起啊,定义一个递归查询的函数:
/**
* 递归获取结构树
* @param array $data 数据源
* @param integer $pid 父类id
* @param integer $level 深度
* @return array 组装好的树
*/
function get_tree($data, $pid = 0, $level = 0) {
static $tree = array();
foreach ($data as $key => $row) {
if ($row['pid'] == $pid) {
$row['level'] = $level;
$tree[] = $row;
unset($data[$key]); //进入树结构后,接下里要查的就只是它的子类了,所以从$data中删除,减少后面查询次数
get_tree($data, $row['id'], $level + 1);
}
}
return $tree;
}
调用函数,并输出:
$tree = get_tree($data, 0, 0);
var_dump($tree);
结果:
在用一个简单暴力的方式,呈现在页面上,感受一下:
/**
* 输出树结构
* @param array 数据源
* @return void
*/
function echo_tree($tree) {
foreach ($tree as $row) {
for ($i = $row['level']; $i > 0; $i--) {
echo '|----';
}
echo $row['name'];
echo '<br>';
}
}
结果:
php递归获取分类结构的更多相关文章
- Think PHP递归获取所有的子分类的ID (删除当前及子分类)
递归获取所有的子分类的ID: //递归获取所有的子分类的ID function get_all_child($array,$id){ $arr = array(); foreach($array as ...
- php递归无限分类、根据子类获取所有顶类
//递归无限分类树 public static function diGui($data, $pid) { $arr = collect([]); if (empty($data)) { return ...
- web api+递归树型结构
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...
- php 非递归实现分类树
本文实例讲述了php通过前序遍历树实现无需递归的无限极分类.分享给大家供大家参考.具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限 ...
- php 两种获取分类树的方法
php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...
- 在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组)
原文:在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...
- 递归概念&分类&注意事项和练习_使用递归计算1-n之间的和
递归:方法自己调用自己 递归的分类: 递归分为两种,直接递归和间接递归 直接递归称为方法自身调用自己 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法 注意事项: 递归一定要有条件限定 ...
- 【MongoDB】递归获取字段更新表达式,更新复杂数据类型对象
在实际更新Mongo对象时发现,原有的更新代码无法更新复杂的数据类型对象.恰好看到张占岭老师有对该方法做相关的改进,因此全抄了下来. 总的核心思想就是运用反射与递归,对对象属性一层一层挖掘下去,循环创 ...
- php递归获取顶级父类id
php递归获取顶级父类id function get_top_parentid($id){ $r = M('navclass')->where('id = '.$id)->field('i ...
随机推荐
- Centos出现-bash: unzip: command not found的解决办法
利用unzip命令解压缩的时候,出现-bash: unzip: command not found的错误. unzip——命令没有找到,其原因肯定是没有安装unzip. 利用一句命令就可以解决了. ...
- SSH版最大会话连接数
在登录方法中加入如下两行语句,作为程序的入口: SessionListener.isAlreadyEnter(getHttpRequest().getSession(),this.getUserCod ...
- 题解 P3628 【[APIO2010]特别行动队 】
题目大意 给你一个序列, 将这个序列分成若干段, 每一段的贡献为 \(ax ^ 2 + bx + c\)(x 为 这一段的权值之和) 具体思路 50pts 考虑Dp, 设\(Dp_i\)为前i ...
- php if 的实现
简单分析下php中的分支背后的实现 <?php ){ echo "a"; }else{ echo "b"; } 1.语法分析 unticked_state ...
- php-fpm定时器
php-fpm有三种定时器 1)主进程接收到用户的信号,例如sigusr,主进程执行kill(子进程号,sigquit),的同时,设置定时器,在一个无限循环里如果当前时间 大于或等于 该定时器的过期时 ...
- XmlDocument 避免XXE
string xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\&quo ...
- python3 使用 zabbix_client模块
除了上一篇使用自己定义的函数,我们还可使用pipy提供的zabbix_client模块,这样就不用我们自己去写登录函数,只要在模块开始指定用户名密码即可,方便很多. #!/usr/bin/env py ...
- 【树】Populating Next Right Pointers in Each Node
题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...
- Apache版本hadoop-2.6.0.tar.gz平台下搭建Hue
不多说,直接上干货! http://archive.apache.org/dist/ http://www.cnblogs.com/smartloli/p/4527168.html http://ww ...
- WPF中List的Add()与Insert()方法的区别
先来看看定义: // Summary: // Adds an object to the end of the System.Collections.Generic.List<T>. // ...