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 ...
随机推荐
- [Auto Testing] 工具准备:Selenium 与 ChromeDriver
<留存> Selenium http://selenium-release.storage.googleapis.com/index.html https://www.seleniumhq ...
- 六:MyBatis学习总结(六)——调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...
- 转的很好的前端html 内容
HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...
- subtext 安装PythonIDE -Anaconda
安装PythonIDE -Anaconda 打开subtext,通过快捷键 cmd+shift+P 打开 Package Control 来安装其他的插件了. 输入 install 然后你就能看见屏幕 ...
- 【xsy1116】数学题 奥数题
真实奥数题 题目大意:给你正整数k$,r$.问你存在多少对$(x,y)$,满足$x<y$且$x^2+y^2=kz^2$,并将所有符合条件的数对输出. 数据范围:$r≤1e9$,$k={1,2,3 ...
- springboot打包成jar包后找不到xml,找不到主类的解决方法
springboot打包成jar包后找不到xml,找不到主类的解决方法 请首先保证你的项目能正常运行(即不打包的时候运行无误),我们在打包时经常遇到如下问题: springboot打包成jar包后找不 ...
- 通过Groovy来消除代码噪声
通过Groovy来消除代码噪声 Java是在JVM上运行的最广泛使用的编程语言.不过,还有很多其他基于JVM的语言,比如Groovy,Scala,JRuby,Jython,Kotlin等等.其中,Gr ...
- habase 报错 ERROR: Can't get master address from ZooKeeper; znode data == null
方法一:查看日志报SessionExpiredException: KeeperErrorCode = Session expired for /hbase/master 所以是hbase 和 zoo ...
- IE6基本bug
一.IE6双倍边距bug当页面上的元素使用float浮动时,不管是向左还是向右浮动:只要该元素带有margin像素都会使该值乘以2,例如“margin-left:10px” 在IE6中,该值就会被解析 ...
- Python虚拟环境中pip install时没有权限问题
virtualenv Permission denied 新建的python虚拟环境的目录的所属者必须是当前用户,才不会出现这种错误 比如 virtualenv py27 sudo chown zzf ...