无限级分类的原理(递归方法)

在web开发当中,我们经常会遇到无限级分类,既中国有北京、天津、河北、河南等省(自治区、直辖市),河北有石家庄、张家口、唐山等地级市,石家庄又有正定县、无极县,正定县又有。。。。

实现这种无限级分类,我们只需要在字段中增加一个pid,用于记录父类的id,这时候我们就可以采用递归的方式得到最终的结果,这里面有两种处理方式,一种是得到一个二维数组,一种是得到一个多维数组。具体代码如下:

/*由父类得到全部子类,得到一个二维数组*/

function getChildren2($list,$pid=0){
  static $arr = array();
  foreach ($list as $key => $value) {
    if ($value['pid']==$pid) {
      $arr[] = $value;
      getChildren2($list,$value['id']);
    }
  }    
  return $arr;
}
function getChildren($list,$pid=0){
  $arr = array();
  foreach ($list as $key => $value) {
    if ($value['pid']==$pid) {
      $value['children']=
      getChildren($list,$value['id']);
      $arr[] = $value;
    }
  }    
  return $arr;
}

两者实现的代码都比较简单,但因为涉及到了递归,好多人就看不懂代码了,本文就通过举例子的方式,带领大家一步步分析一下代码的原理。(A表示遍历的第一层,B表示遍历的第二层,B1表示第二层的第一次遍历,C2表示第三层的第二次遍历),建议大家边看边拿出张纸画一下。

先是进行遍历(A层),找到pid为0,也就是最高一级的分类,假如我们找到了北京(id=1),这时候我们就进入了递归,搜索条件pid=0也就变成了pid=1,既找到北京全部的子类。

再次遍历(B1层),找到一个名为海淀(id=8)的数据,它的pid为1,符合条件,是北京的子类,这时候我们再次进入递归,搜索条件pid=1也就变成了pid=8,既找到海淀全部的子类。

再次遍历(C1层),找到一个名为中关村(id=15)的数据,它的pid为8,符合条件,是海淀的子类,这时候我们再次进入递归,搜索条件pid=8也就变成了pid=15,既找到中关村全部的子类。

再次遍历(D1层),发现没有数据的pid是15,也就是中关村没有子类,那么本层遍历结束,继续进行C1层的遍历(既找pid为8的数据),找到一个名为魏公村(id=20)的数据,它的pid是8,符合条件,是海淀的子类,这时候再次进入递归,搜索条件pid=15也就变成了pid=20,既找到魏公村全部的子类。

再次遍历(D2层),发现没有数据的pid是20,也就是魏公村没有子类,那么本层遍历结束,继续进行C1层的遍历。

遍历C1层,发现没有pid为8的数据了,那么本层(C1)遍历结束,继续回到B1层进行遍历。

遍历B1层,发现数据朝阳(id=9),它的pid为1,符合条件,是北京的子类,这时候我们再次进入递归,搜索条件pid=1也就变成了pid=9,既找到朝阳全部的子类。

遍历C2层,发现没有数据符合条件,退回到B1层。

继续遍历B1层,发现没有数据符合pid=1,既北京的子类已经全部找到了,那么退回到A层。

继续遍历A层,发现河北(id=19)的pid为0,符合条件,这时候我们就进入了递归,搜索条件pid=0也就变成了pid=19,既找到河北全部的子类。

遍历B2层。。。。。。。。。。。。。。

id  name    pid
1   北京      0
8   海淀      1
9   朝阳      1
15  中关村    8
19  河北      0
20  魏公村    8

以上是例子当中的部分数据,注意这个顺序是可以随意打乱的,只要你的pid正确就能得到最终的结果。

如果感觉看的比较乱套,还是一点拿出纸和笔,自己列一些数据,按照代码的流程自己写一下,其实很容易理解的。

猜你喜欢

转载自blog.csdn.net/pan_yuyuan/article/details/81879479
今日推荐