$arr = array(
0=>array('id'=>1,'pid'=>0,'name'=>'亚洲'),
1=>array('id'=>2,'pid'=>0,'name'=>'北美洲'),
2=>array('id'=>3,'pid'=>1,'name'=>'中国'),
3=>array('id'=>4,'pid'=>2,'name'=>'美国'),
4=>array('id'=>5,'pid'=>3,'name'=>'北京'),
5=>array('id'=>6,'pid'=>3,'name'=>'上海'),
6=>array('id'=>7,'pid'=>5,'name'=>'海淀区'),
);
function getSons($arr,$id=0)
{
//定义一个临时的空数组存放排序后的数据
$temp=array();
//遍历整个数组,查找符合条件的子孙
foreach($arr as $v)
{
//如果数组中某个元素的父id等于传参过来的id,说明这个元素是它的子孙
if($v['pid']==$id)
{
//将此元素存入临时的数组中
$temp[]=$v;
//利用递归的方法,再次调用自身,查找这个元素本身还有没有子孙
$temp=array_merge($temp,getSons($arr,$v['id']));
}
}
return $temp;
}
var_dump( getSons($arr,0));
代码解析:
第一次循环的时候,肯定是亚洲符合条件,所以亚洲会被存入临时数组。注意这时第一层循环并不会继续执行下去,因为我们这个时候要去查找亚洲还有没有子孙。通过调用自身,再次进入第二层循环,这次我们找到了中国,找到中国后,第二层又会被打断,进入第三层,找到了北京,第三层被打断,进入第四层,找到了海淀,第四层被打断,进入第五层,找海淀的子孙,通过遍历数组可知,海淀并没有子孙。第五层会继续执行下去,就是最后一句return
t
e
m
p
。
这
个
函
数
的
返
回
值
会
返
回
到
第
四
层
中
调
用
他
的
地
方
,
当
然
这
里
的
temp。这个函数的返回值会返回到第四层中调用他的地方,当然这里的
temp。这个函数的返回值会返回到第四层中调用他的地方,当然这里的temp是个空数组。第四层会继续执行下去,
t
e
m
p
里
此
时
包
含
海
淀
,
返
回
到
第
三
层
,
temp里此时包含海淀,返回到第三层,
temp里此时包含海淀,返回到第三层,temp里包含了北京和海淀,以此类推,第二层中国,北京,海淀,第一层亚洲,中国,北京,海淀。到此时第一层循环继续执行下去,会找到和亚洲平级的北美洲,北美洲又会通过递归查找自己的子孙,一层一层嵌套执行下去。
注意:每次函数递归调用的时候,$temp都会被初始化,这样保存的数据就会丢失,所以要用array_merge函数把两个数组的数据整合在一起。
递归图解: