php递归获取无限分类菜单
从数据库获取所有菜单信息,需要根据id,pid字段获取主菜单及其子菜单,以及子菜单下的子菜单,可以通过函数递归来实现。
<?php
class Menu {
public $menu = array(
array('id'=>1, 'title'=>"一级1",'pid'=>0),
array('id'=>2, 'title'=>"一级2",'pid'=>0),
array('id'=>3, 'title'=>"二级11",'pid'=>1),
array('id'=>4, 'title'=>"二级12",'pid'=>1),
array('id'=>5, 'title'=>"二级21",'pid'=>2),
array('id'=>6, 'title'=>"二级22",'pid'=>2),
array('id'=>7, 'title'=>"三级1",'pid'=>3),
array('id'=>8, 'title'=>"三级2",'pid'=>3),
); public function __construct() {
return $this->getMenu();
}
/**
* 主菜单pid为0
* @return array
*/
protected function getMenu() {
foreach ($this->menus as $key => $items) {
if ($items['pid'] == "0" ) {
unset($this->menu[$key]);
$menu[] = $this->buildMenuTree($items, $items['id']);
}
}
return $menu;
}
/**
* 生产多级菜单树
* @param array $items
* @param int $rid
* @return array
*/
protected function buildMenuTree($items,$rid) {
$childs = $this->getChildMenu($items, $rid);
if (isset($childs['child'])) {
foreach ($childs['child'] as $key => $value) {
$children = $this->buildMenuTree($value, $value['id']);
if (null != $children['child']) {
$childs['child'][$key]['child'] = $children['child'];
}
}
}
return $childs;
} /**
* 获取子菜单
*
*/
protected function getChildMenu($items,$rid) {
foreach ($this->menu as $key => $value) {
if ($value['pid'] == $rid) {
unset($this->menu[$key]);
$items['child'][] = $value;
}
}
return $items;
} } var_dump(new Menu);
测试结果为:
array(2) {
[0] => array(4) {
["id"] => int(1)
["title"] => string(7) "一级1"
["pid"] => int(0)
["child"] => array(2) {
[0] => array(4) {
["id"] => int(3)
["title"] => string(8) "二级11"
["pid"] => int(1)
["child"] => array(2) {
[0] => array(3) {
["id"] => int(7)
["title"] => string(7) "三级1"
["pid"] => int(3)
}
[1] => array(3) {
["id"] => int(8)
["title"] => string(7) "三级2"
["pid"] => int(3)
}
}
}
[1] => array(3) {
["id"] => int(4)
["title"] => string(8) "二级12"
["pid"] => int(1)
}
}
}
[1] => array(4) {
["id"] => int(2)
["title"] => string(7) "一级2"
["pid"] => int(0)
["child"] => array(2) {
[0] => array(3) {
["id"] => int(5)
["title"] => string(8) "二级21"
["pid"] => int(2)
}
[1] => array(3) {
["id"] => int(6)
["title"] => string(8) "二级22"
["pid"] => int(2)
}
}
}
}
php递归获取无限分类菜单的更多相关文章
- TreeView递归绑定无限分类数据
TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...
- php不用递归完成无限分类,从表设计入手完整演示过程
无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, ...
- php不使用递归实现无限极分类
无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...
- 后台树状菜单,js实现递归无限分类
//新闻类别管理 public function new_classify() { $arr = M('news_classify')->where("fid = 0")-& ...
- php递归无限分类、根据子类获取所有顶类
//递归无限分类树 public static function diGui($data, $pid) { $arr = collect([]); if (empty($data)) { return ...
- php递归获取分类结构
商城的菜单通常都是树状结构,我们来模仿实现以下. 原理都是相同的,所以我们来个简单点的结构就行.层级只有两层,有两大类:手机和电脑:每个大类下面分别有三个子类: //从数据库获取的分类数据(省略获取步 ...
- Think PHP递归获取所有的子分类的ID (删除当前及子分类)
递归获取所有的子分类的ID: //递归获取所有的子分类的ID function get_all_child($array,$id){ $arr = array(); foreach($array as ...
- Think PHP递归重新排序无限极子分类数组(递归无限极分类)
Think PHP递归重新排序无限极子分类数组 // 递归重新排序无限极子分类数组 function recursive($array,$pid=0,$level=0){ $arr = array() ...
- laravel-nestedset:多级无限分类正确姿势
laravel-nestedset:多级无限分类正确姿势 laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安 ...
随机推荐
- 07-01 Java 封装
1:成员变量和局部变量的区别 /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量 ...
- hive中解决中文乱码
一.个人初始开发环境的基本情况以及Hive元数据库说明 ①hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置) ②hive-site.xml中设置元数据库对应的配置为 j ...
- 多线程之CountDownLatch和CyclicBarriar使用
CountDownLatch和CyclicBarriar是java.util.concurrent包下面提供的多线程同步工具,两者有点相似,相当于计数器,但是用处还是有区别的. CountDownLa ...
- 如何查看第三方apk的信息
很多时候,我们需要获取别人的apk的信息.但是我们看不到apk的代码,对于apk的信息并没有直接的方法获取.那么,我们要怎么获取apk信息呢? 这里,我整理了两个方法,亲测可用. 第一种,直接使用An ...
- 【Java初探实例篇01】——Java语言基础
示例系列,将对每节知识辅以实际代码示例,通过代码实际编写,来深入学习和巩固学习的知识点. IDE:intellij IDEA: 语言:Java 本次示例:Java语言基础知识的应用. 创建包day_4 ...
- 关于VS2017的安装和WDK的选择问题
首先就是关于VS2017的安装,我们可以通过微软的官网去寻找我们想要安装的VS版本 我们可以随便选择一个我们需要的版本进行下载,任意版本的VS都可以. 然后下载安装的时候,要进行一下这个安装选项的选择 ...
- Java中的八大基本数据类型
Java中的基本类型主要包括整数.浮点数.字符和布尔类型. 整数: 整数类型主要包括byte.short.int.long四种类型,所占大小分别为1byte.2byte.4byte和8byte: 浮点 ...
- 行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式
1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子 ...
- spinnaker自动发布k8s部署应用<一>
一.准备环境 !docker-ce---17.06.2-ce !k8s集群----1.11.1 !helm部署工具---helm-v2.10.0 !spinnaker-charts---spinnak ...
- Mac添加命令别名
1. 切换到用户主目录 $ cd 2. 编辑或新建.bash_profile文件 3. 添加别名 命令别名设置语法: alias [别名]='[指令名称]' 注意:等号两边均无空格,指令名称中如有空格 ...