在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正确就能得到最终的结果。
如果感觉看的比较乱套,还是一点拿出纸和笔,自己列一些数据,按照代码的流程自己写一下,其实很容易理解的。