zoukankan      html  css  js  c++  java
  • 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 }
    数组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嵌套的方式循环输出有层次的数据,我们需要把原始的二维数组,按照归属关系组合到一起。

    形如:一个多维数组
     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 }
    数组arr02

    我们写一个递归函数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



  • 相关阅读:
    Linux cat
    Linux touch
    Win10 UAP 绑定
    Win10 资源文件
    Win10 启动模拟器
    Win10 安装Vs2015 社区版和企业版各个问题汇总
    Win10 开发者模式开启
    android 入门-本地化语言
    android 入门-基础了解
    wp8 入门到精通 定时更新瓷贴
  • 原文地址:https://www.cnblogs.com/andy9468/p/4271230.html
Copyright © 2011-2022 走看看