商城的菜单通常都是树状结构,我们来模仿实现以下。

原理都是相同的,所以我们来个简单点的结构就行。层级只有两层,有两大类:手机和电脑;每个大类下面分别有三个子类:

 //从数据库获取的分类数据(省略获取步骤)
//有“手机”和“电脑”两个大类
//--手机{三星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递归获取分类结构的更多相关文章

  1. Think PHP递归获取所有的子分类的ID (删除当前及子分类)

    递归获取所有的子分类的ID: //递归获取所有的子分类的ID function get_all_child($array,$id){ $arr = array(); foreach($array as ...

  2. php递归无限分类、根据子类获取所有顶类

    //递归无限分类树 public static function diGui($data, $pid) { $arr = collect([]); if (empty($data)) { return ...

  3. web api+递归树型结构

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...

  4. php 非递归实现分类树

    本文实例讲述了php通过前序遍历树实现无需递归的无限极分类.分享给大家供大家参考.具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限 ...

  5. php 两种获取分类树的方法

    php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...

  6. 在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组)

    原文:在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...

  7. 递归概念&分类&注意事项和练习_使用递归计算1-n之间的和

    递归:方法自己调用自己 递归的分类: 递归分为两种,直接递归和间接递归 直接递归称为方法自身调用自己 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法 注意事项: 递归一定要有条件限定 ...

  8. 【MongoDB】递归获取字段更新表达式,更新复杂数据类型对象

    在实际更新Mongo对象时发现,原有的更新代码无法更新复杂的数据类型对象.恰好看到张占岭老师有对该方法做相关的改进,因此全抄了下来. 总的核心思想就是运用反射与递归,对对象属性一层一层挖掘下去,循环创 ...

  9. php递归获取顶级父类id

    php递归获取顶级父类id function get_top_parentid($id){ $r = M('navclass')->where('id = '.$id)->field('i ...

随机推荐

  1. Centos出现-bash: unzip: command not found的解决办法

    利用unzip命令解压缩的时候,出现-bash:  unzip: command not found的错误. unzip——命令没有找到,其原因肯定是没有安装unzip. 利用一句命令就可以解决了.  ...

  2. SSH版最大会话连接数

    在登录方法中加入如下两行语句,作为程序的入口: SessionListener.isAlreadyEnter(getHttpRequest().getSession(),this.getUserCod ...

  3. 题解 P3628 【[APIO2010]特别行动队 】

    题目大意 ​ 给你一个序列, 将这个序列分成若干段, 每一段的贡献为 \(ax ^ 2 + bx + c\)(x 为 这一段的权值之和) 具体思路 50pts ​ 考虑Dp, 设\(Dp_i\)为前i ...

  4. php if 的实现

    简单分析下php中的分支背后的实现 <?php ){ echo "a"; }else{ echo "b"; } 1.语法分析 unticked_state ...

  5. php-fpm定时器

    php-fpm有三种定时器 1)主进程接收到用户的信号,例如sigusr,主进程执行kill(子进程号,sigquit),的同时,设置定时器,在一个无限循环里如果当前时间 大于或等于 该定时器的过期时 ...

  6. XmlDocument 避免XXE

    string xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\&quo ...

  7. python3 使用 zabbix_client模块

    除了上一篇使用自己定义的函数,我们还可使用pipy提供的zabbix_client模块,这样就不用我们自己去写登录函数,只要在模块开始指定用户名密码即可,方便很多. #!/usr/bin/env py ...

  8. 【树】Populating Next Right Pointers in Each Node

    题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...

  9. Apache版本hadoop-2.6.0.tar.gz平台下搭建Hue

    不多说,直接上干货! http://archive.apache.org/dist/ http://www.cnblogs.com/smartloli/p/4527168.html http://ww ...

  10. WPF中List的Add()与Insert()方法的区别

    先来看看定义: // Summary: // Adds an object to the end of the System.Collections.Generic.List<T>. // ...