<?php //无限极分类 //parent 的值,是该栏目的父栏目的id 反之是 /*0 安徽 合肥 北京 海淀 中关村 上地 河北 石家庄 */ $area = array( array('id'=>1,'name'=>'安徽','parent'=>0), array('id'=>2,'name'=>'北京','parent'=>0), array('id'=>3,'name'=>'海淀','parent'=>2), array('id'=>4,'name'=>'中关村','parent'=>3), array('id'=>5,'name'=>'合肥','parent'=>1), array('id'=>6,'name'=>'上地','parent'=>3), array('id'=>7,'name'=>'河北','parent'=>0), array('id'=>8,'name'=>'石家庄','parent'=>7), ); /* 1.是找指定栏目的子孙栏目,即子孙树 2.是找指定栏目的父栏目/父父栏目……顶级栏目,即家谱树 */ //找子栏目 function findson($arr,$id=0) { //$id栏目的儿子有哪些呢? //A:数组循环一遍,谁的parent的值 = $id ,谁就是他的儿子 $sons = array(); //子栏目数组 foreach ($arr as $v) { if ($v['parent'] == $id) { $sons[] = $v; } } return $sons; } //print_r(findson($area,0)); //找子孙树 静态属性调用 /* 在函数中声明的static静态变量 无论此函数调用多少次,只初始化一次 以后直接沿用该变量 在递归时,很有用 static 总结 1.修饰类的属性与方法为静态属性,静态方法 2.static::method(),延迟绑定 3.在函数/方法中,声明静态变量用 */ function subtree($arr,$id=0,$lev=1) { static $subs = array(); //子孙数组 foreach ($arr as $v) { if ($v['parent'] == $id) { $v['lev'] = $lev; $subs[] = $v; //举例说array('id'=>1,'name'=>'安徽','parent'=>0), subtree($arr,$v['id'],$lev+1); } } return $subs; } /*print_r(subtree($area,0,1)); $tree = subtree($area,0,1); foreach ($tree as $v) { # code... echo str_repeat(' ',$v['lev']),$v['name'],'<br />'; } */ //第二种不用静态变量 function subtree2($arr,$id=0,$lev=1) { $subs = array(); //子孙数组 foreach ($arr as $v) { if ($v['parent'] == $id) { $v['lev'] = $lev; $subs[] = $v; //举例说array('id'=>1,'name'=>'安徽','parent'=>0), $subs = array_merge($subs, subtree2($arr,$v['id'],$lev+1)); } } return $subs; } $tree = subtree2($area,0,1); foreach ($tree as $v) { echo str_repeat(' ',$v['lev']),$v['name'],'<br />'; } ?>