简单的demo
function test($n){
if($n>0){
echo $n,",";
test($n-1);
echo $n,",";
}
}
test(5);//5,4,3,2,1,1,2,3,4,5,
解读理解
- 当$n=5开始执行时,最后一行echo始终是挂起的,等到$n=0的时候,才会将挂起的echo一个个输出
关于无限分类的demo
function tree($arr,$pid=0,$level=0){
static $res=array();
foreach($arr as $v){
if($v['pid'] == $pid){
$v['level'] = $level;
$res[] = $v;
tree($arr,$v['id'],$level+1);
}
}
return $res;
}
解读理解
- 找到pid=0作为当前节点,在来查找子分类时,遍历先挂起,依次逐层这样查找子分类,都将遍历挂起,当所有遍历结束,再无子分类后,就返回到pid=0的节点,这时再将挂起的依次逐层遍历出来
商城中展示商品分类的效果
我们需要将平行的二维数组转成包含关系的多维数组
$cat = array(
array('cat_id'=>1,'cat_name'=>'服装','pid'=>0),
array('cat_id'=>2,'cat_name'=>'家用电器','pid'=>0),
array('cat_id'=>3,'cat_name'=>'男装','pid'=>1),
array('cat_id'=>4,'cat_name'=>'女装','pid'=>1),
array('cat_id'=>5,'cat_name'=>'衬衫','pid'=>3),
array('cat_id'=>6,'cat_name'=>'牛仔裤','pid'=>3),
array('cat_id'=>7,'cat_name'=>'裙子','pid'=>4),
);
//转成包含关系的多维数组
$res = array(
array(
'cat_id'=>1,
'cat_name'=>'服装',
'pid'=>0,
'child'=>array(
array(
'cat_id'=>3,
'cat_name'=>'男装',
'pid'=>1,
'child'=>array(
array('cat_id'=>5,'cat_name'=>'衬衫','pid'=>3),
array('cat_id'=>6,'cat_name'=>'牛仔裤','pid'=>3)
)
)
array(
'cat_id'=>4,
'cat_name'=>'女装',
'pid'=>1,
'child'=>array(
array('cat_id'=>7,'cat_name'=>'裙子','pid'=>4),
)
)
)
)
);
因为我们需要这种包含关系的多维数组,所以通过递归来完成
public function child($arr,$pid=0){
$res = array();
foreach($arr as $v){
if($v['pid'] == $pid){
$v['child'] = $this->child($arr,$v['cat_id']);
$res[] = $v;
}
}
return $res;
}
最后在前台页面上输出
foreach($cat as $v)
...
foreach($v['child'] as $v1)
...
foreach($v1['child'] as $v2)
...