需求描述:

现有一个节点集合

可以视为一个二维数组

 array(5) {
[0] => array(4) {
["id"] => string(1) "1"
["name"] => string(5) "Admin"
["title"] => string(12) "后台应用"
["pid"] => string(1) "0"
}
[1] => array(4) {
["id"] => string(1) "2"
["name"] => string(5) "Index"
["title"] => string(12) "前端应用"
["pid"] => string(1) "0"
}
[2] => array(4) {
["id"] => string(1) "3"
["name"] => string(5) "Index"
["title"] => string(12) "后台首页"
["pid"] => string(1) "1"
}
[3] => array(4) {
["id"] => string(1) "4"
["name"] => string(10) "MsgManager"
["title"] => string(12) "帖子管理"
["pid"] => string(1) "1"
}
[4] => array(4) {
["id"] => string(1) "5"
["name"] => string(4) "Rbac"
["title"] => string(10) "RBAC权限"
["pid"] => string(1) "1"
}
}

数组arr01

pid、level字段解释:

pid表示父级的id。取值范围{0,1,2,3,... ,n,...}
pid的值为0,表示这条记录不属于任何其他记录。

pid的值为1,表示这条记录属于id为1的记录。即为id为1的记录的子记录。

pid的值为2,表示这条记录属于id为2的记录。即为id为2的记录的子记录。

......

以此类推。

level表示层次、级别。取值范围{1,2,3},即为3个层次、或者是3个级别

level的值为1,表示第一层次,最高层次级,最高级别。

level的值为2,表示第二层次。
level的值为3,表示第三层次。

例如,如果level=1代表导航栏中的首页、公司部门、产品介绍等等
那么,level=2就代表部门A、部门B、...;产品A、产品B、产品C、... 这样,仅仅靠一个二维表,就能保存下各条记录的归属关系。 但是,为了使用foreach嵌套的方式循环输出有层次的数据,我们需要把原始的二维数组,按照归属关系组合到一起。 形如:一个多维数组
 array(2) {
[0] => array(5) {
["id"] => string(1) "1"
["name"] => string(5) "Admin"
["title"] => string(12) "后台应用"
["pid"] => string(1) "0"
["child"] => array(3) {
[0] => array(5) {
["id"] => string(1) "3"
["name"] => string(5) "Index"
["title"] => string(12) "后台首页"
["pid"] => string(1) "1"
["child"] => array(0) {
}
}
[1] => array(5) {
["id"] => string(1) "4"
["name"] => string(10) "MsgManager"
["title"] => string(12) "帖子管理"
["pid"] => string(1) "1"
["child"] => array(0) {
}
}
[2] => array(5) {
["id"] => string(1) "5"
["name"] => string(4) "Rbac"
["title"] => string(10) "RBAC权限"
["pid"] => string(1) "1"
["child"] => array(0) {
}
}
}
}
[1] => array(5) {
["id"] => string(1) "2"
["name"] => string(5) "Index"
["title"] => string(12) "前端应用"
["pid"] => string(1) "0"
["child"] => array(0) {
}
}
}

数组arr02

我们写一个递归函数node_merge()来实现:

 <?php
/**
* 递归重组节点信息多维数组
* @param [array] $node [要处理的节点数组:二维数组]
* @param [int] $pid [父级ID]
* @return [array] [树状结构的节点体系:多维数组]
*/
function node_merge($node,$pid=0){
$arr=array(); foreach ($node as $v) {
if ($v['pid']==$pid) {
$v['child']=node_merge($node,$v['id']);
$arr[]=$v;
}
} return $arr;
}
?>
怎么理解这个函数呢?

我们以处理原始的二维数组(arr01)的数据为例,通过调用node_merge()函数,转换成可直接看出归属关系的多维数组(arr02)。

函数中的$node即为arr01,当传入arr01数组时,$pid初始化为0值,函数新建一个临时数组(arr);

接着,用foreach循环,读取第一条记录(id=1那条记录),判断式处理:如果第一条记录中的父级id是0,那么正好等于初始化的$pid,

那么,在第一条记录中,加上一个字段(child)。第一条记录中的child字段的取值,来自pid=1的记录(想想为什么。提示:从node_merge($node,$v['id']);中的$v['id']入手)。

而取值操作是来自$arr[]=$v;这句命令。

这使用的是递归,函数调用函数,这是我的理解,如果你有更好的理解,可以给我留言。邮箱:1465567571@qq.com

ThinkPHP中:使用递归写node_merge()函数的更多相关文章

  1. Thinkphp中controller控制器根据curl函数请求数据

    public function member(){ $url="http://aitequn.tjnit.com/UserAction_findAllUser"; $ch =cur ...

  2. C#中的函数式编程:递归与纯函数(二)

    在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential transparency)来定义的.如果一个 ...

  3. Thinkphp中的 I 函数(Thinkphp3.2.3版本)

    I 函数的作用是获取系统变量,必要时还可以对变量值进行过滤及强制转化,I 函数的语法格式: I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源']) 一.获取变量 ...

  4. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  5. 有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。

    [提交][状态][讨论版] 题目描述 有一字符串,包含n个字符.写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串. 输入 数字n 一行字符串 数字m 输出 从m开始的子串 样例输入 ...

  6. 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果

    package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

  7. HTML中直接写js 函数

    1.在HTML中直接写JS函数: <body onload="javascript:{window.location.href='http://www.baidu.com/'}&quo ...

  8. C语言:写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出

    题目描述 写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出. 输入 一行字符串 输出 顺序输出其中的元音字母(aeiuo) 样例输入 abcde 样例输出 ae 编码: #include ...

  9. 38 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

    题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class _038PrintLength { public static void main(Stri ...

随机推荐

  1. 更改pip源至国内镜像,显著提升下载速度

    经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上库的 ...

  2. HTML Input属性

    HTML Input 属性 value 属性 value 属性规定输入字段的初始值: readonly 属性 readonly 属性规定输入字段为只读(不能修改): readonly 属性不需要值.它 ...

  3. Spark Structured streaming框架(1)之基本使用

     Spark Struntured Streaming是Spark 2.1.0版本后新增加的流计算引擎,本博将通过几篇博文详细介绍这个框架.这篇是介绍Spark Structured Streamin ...

  4. 一次由SELinux引起的ssh公钥认证失败问题

    一直使用CentOS作为服务器系统,平时装完系统以后都是建立publickey认证机制,然后关闭密码认证.原本是一件轻车熟路毫无压力的事情,不想前日新装一台机器按照正常配置以后居然使用publicke ...

  5. RGB转MIPI CSI芯片方案TC358746XBG

    型号:TC358746XBG功能:RGB888/666/565与MIPI CSI 互转通信方式:IIC/SPI分辨率:720p电源:3.3/1.2V封装形式:BGA72深圳有现货库存,价格有优势,样片 ...

  6. Spark Mllib框架1

    1. 概述 1.1 功能 MLlib是Spark的机器学习(machine learing)库,其目标是使得机器学习的使用更加方便和简单,其具有如下功能: ML算法:常用的学习算法,包括分类.回归.聚 ...

  7. ThinkPhp5源码剖析之Cache

    为什么需要Cache(缓存)? 假设现在有一个小说网,有非常多的读者,有一篇新的章节更新了,那么可能一分钟内有几万几十万的访问量. 如果没有缓存,同样的内容就要去数据库重复查询,那可能网站一下就挂掉了 ...

  8. fixed定位兼容性

    不过从ios5.1以来,fixed定位就已经支持了,但很遗憾,ios现在对它还只是半支持. 但是在某些情况下,会出现一些比较奇葩的问题,比如fixed元素中存在输入框子元素,这个时候就会跪了. 可以看 ...

  9. 201521123025《java程序设计》第七周学习总结

    1. 本周学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { r ...

  10. 201521123069 《Java程序设计》 第3周学习总结

    1. 本章学习总结 如果看不清楚可点击类与对象 2. 书面作业 Q1. 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private sta ...