首页 > 代码库 > ThinkPHP中:使用递归写node_merge()函数
ThinkPHP中:使用递归写node_merge()函数
需求描述:
现有一个节点集合
可以视为一个二维数组
1 array(5) { 2 [0] => array(4) { 3 ["id"] => string(1) "1" 4 ["name"] => string(5) "Admin" 5 ["title"] => string(12) "后台应用" 6 ["pid"] => string(1) "0" 7 } 8 [1] => array(4) { 9 ["id"] => string(1) "2"10 ["name"] => string(5) "Index"11 ["title"] => string(12) "前端应用"12 ["pid"] => string(1) "0"13 }14 [2] => array(4) {15 ["id"] => string(1) "3"16 ["name"] => string(5) "Index"17 ["title"] => string(12) "后台首页"18 ["pid"] => string(1) "1"19 }20 [3] => array(4) {21 ["id"] => string(1) "4"22 ["name"] => string(10) "MsgManager"23 ["title"] => string(12) "帖子管理"24 ["pid"] => string(1) "1"25 }26 [4] => array(4) {27 ["id"] => string(1) "5"28 ["name"] => string(4) "Rbac"29 ["title"] => string(10) "RBAC权限"30 ["pid"] => string(1) "1"31 }32 }
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嵌套的方式循环输出有层次的数据,我们需要把原始的二维数组,按照归属关系组合到一起。
形如:一个多维数组
1 array(2) { 2 [0] => array(5) { 3 ["id"] => string(1) "1" 4 ["name"] => string(5) "Admin" 5 ["title"] => string(12) "后台应用" 6 ["pid"] => string(1) "0" 7 ["child"] => array(3) { 8 [0] => array(5) { 9 ["id"] => string(1) "3"10 ["name"] => string(5) "Index"11 ["title"] => string(12) "后台首页"12 ["pid"] => string(1) "1"13 ["child"] => array(0) {14 }15 }16 [1] => array(5) {17 ["id"] => string(1) "4"18 ["name"] => string(10) "MsgManager"19 ["title"] => string(12) "帖子管理"20 ["pid"] => string(1) "1"21 ["child"] => array(0) {22 }23 }24 [2] => array(5) {25 ["id"] => string(1) "5"26 ["name"] => string(4) "Rbac"27 ["title"] => string(10) "RBAC权限"28 ["pid"] => string(1) "1"29 ["child"] => array(0) {30 }31 }32 }33 }34 [1] => array(5) {35 ["id"] => string(1) "2"36 ["name"] => string(5) "Index"37 ["title"] => string(12) "前端应用"38 ["pid"] => string(1) "0"39 ["child"] => array(0) {40 }41 }42 }
我们写一个递归函数node_merge()来实现:
1 <?php 2 /** 3 * 递归重组节点信息多维数组 4 * @param [array] $node [要处理的节点数组:二维数组] 5 * @param [int] $pid [父级ID] 6 * @return [array] [树状结构的节点体系:多维数组] 7 */ 8 function node_merge($node,$pid=0){ 9 $arr=array();10 11 12 foreach ($node as $v) {13 if ($v[‘pid‘]==$pid) {14 $v[‘child‘]=node_merge($node,$v[‘id‘]);15 $arr[]=$v;16 }17 }18 19 return $arr;20 }21 ?>
怎么理解这个函数呢?
我们以处理原始的二维数组(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()函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。