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简介 安 ...
随机推荐
- 56.storm 之 hello world (集群模式)
回顾 在上一小节,我们在PWTopology1 这一个java类中注解掉了集群模式,使用本地模式大概了解一下storm的工作流程.这一节我们注解掉本地模式相关的代码,放开集群模式相关代码,并且将项目打 ...
- 10-02 Java 形式参数和返回值的问题深入研究,链式编程
形式参数和返回值的问题: 1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该 ...
- odoo 开发基础 -- postgresql重新启动、状态查看
场景描述: 当遇到数据库不能正常访问的时候,我们首先想到的是,查看相关的告警日志,一般先查看系统的日志,然后查看数据库的日志,Linux平台下,postgresql的日志文件存放目录在如下路径: te ...
- JVM中OutOFMemory和StackOverflowError异常代码
1.Out of Memory 异常 右键Run As --->Run Configuration 设置JVM参数 -Xms20m -Xmx20m 上代码: /** * VM Args:-Xms ...
- Bash控制结构
1. if-else语句 #!/bin/bash #if ... fi 语句: if [ $a != $b ] then echo "a != b" fi #if ... else ...
- 牛客网Java刷题知识点float数据在内存中是怎么存储的
不多说,直接上干货! float类型数字在计算机中用4个字节存储. 遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e (1)底数部分 使用二进制数来表示此浮点数的实际值 (2)指 ...
- ubuntu-12.04.5下编译openjdk8
bash ./configure --with-target-bits=64 --with-boot-jdk=/usr/java/jdk1.7.0_80/ --with-debug-level=slo ...
- Nginx限制访问次数和并发数
Nginx限制访问速率和最大并发连接数模块--limit (防止DDOS攻击) http: ##zone=one或allips 表示设置名为"one"或"allips&q ...
- 前端组件化Polymer入门教程(1)——初识&&安装
前端组件化Polymer入门教程目录: 前端组件化Polymer入门教程(1)--初识&&安装 前端组件化Polymer入门教程(2)--快速入门 前端组件化Polymer入门教程(3 ...
- 熟悉DAO模式的用法
今天主要是使用DAO模式. DAO模式通过对业务层提供数据抽象层接口,实现了以下目标: 1. 数据存储逻辑的分离 通过对数据访问逻辑进行抽象,为上层机构提供抽象化的数据访问接口.业务层无需关心具体的s ...