从数据库获取所有菜单信息,需要根据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递归获取无限分类菜单的更多相关文章

  1. TreeView递归绑定无限分类数据

    TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...

  2. php不用递归完成无限分类,从表设计入手完整演示过程

    无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, ...

  3. php不使用递归实现无限极分类

    无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...

  4. 后台树状菜单,js实现递归无限分类

    //新闻类别管理 public function new_classify() { $arr = M('news_classify')->where("fid = 0")-& ...

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

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

  6. php递归获取分类结构

    商城的菜单通常都是树状结构,我们来模仿实现以下. 原理都是相同的,所以我们来个简单点的结构就行.层级只有两层,有两大类:手机和电脑:每个大类下面分别有三个子类: //从数据库获取的分类数据(省略获取步 ...

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

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

  8. Think PHP递归重新排序无限极子分类数组(递归无限极分类)

    Think PHP递归重新排序无限极子分类数组 // 递归重新排序无限极子分类数组 function recursive($array,$pid=0,$level=0){ $arr = array() ...

  9. laravel-nestedset:多级无限分类正确姿势

    laravel-nestedset:多级无限分类正确姿势   laravel-nestedset是一个关系型数据库遍历树的larvel4-5的插件包 目录: Nested Sets Model简介 安 ...

随机推荐

  1. 【2019北京集训2】duck 线段树优化建图+tarjan

    题目大意:给你$n$个点,第$i$个点有点权$v_i$.你需要将这$n$个点排成一排,第$i$个点的点权能被累加当且仅当这个点前面存在编号在$[l_i,r_i]$中的点,问你这些点应该如何排列,点权和 ...

  2. 06-03 Java 面向对象思想概述、开发设计特征,类和对象的定义使用,对象内存图

    面向对象思想概述.开发设计特征 1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一 ...

  3. Docker 镜像安装 GitLab 中文社区版

    docker run \ --detach \ --publish : \ --publish : \ --name gitlab \ --restart unless-stopped \ --vol ...

  4. ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store

    ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store 使用ZooKeeper协调选择一个node作为master.被选择的master broker ...

  5. javascript实现代码高亮-wangHighLighter.js

    1. 引言 (先贴出wangHighLighter.js的github地址:https://github.com/wangfupeng1988/wangHighLighter注意,程序和使用说明的更新 ...

  6. 自然语言处理--jieba和gensim的分词功能

    一.jieba分词功能 1.主要模式 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义: 搜索引擎模 ...

  7. (Dijkstra)迪杰斯特拉算法-最短路径算法

    迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...

  8. 关于Mybatis与Spring整合之后SqlSession与mapper对象之间数量的问题。

    1,sqlsession的真实类型和数量 由于使用spring管理bean,当我们在代码中需要使用这个bean的时候,会首先去容器中找,第一次需要调用MapperFactoryBean的getObje ...

  9. php里input数组的应用

    一般我们使用input传递表单数据时,可以使用<input name="xxx[]" value="1"><input name=" ...

  10. PTA (Advanced Level) 1009 Product of Polynomials

    1009 Product of Polynomials This time, you are supposed to find A×B where A and B are two polynomial ...