$arr=array(
array('id'=>'1','name'=>'北京','parent'=>'0'),
array('id'=>'2','name'=>'上海','parent'=>'0'),
array('id'=>'3','name'=>'浦东','parent'=>'2'),
array('id'=>'4','name'=>'朝阳','parent'=>'1'),
array('id'=>'5','name'=>'广州','parent'=>'0'),
array('id'=>'6','name'=>'三里屯','parent'=>'4'),
array('id'=>'7','name'=>'广东','parent'=>'5'),
array('id'=>'8','name'=>'三里','parent'=>'4')
);
无限级分类,牵涉2个应用0是 找指定栏目的子栏目1是 找指定栏目的子孙栏目,即子孙树
2是 找指定的栏目的父栏目/父栏目....顶级栏目 家谱树
2是 找指定的栏目的父栏目/父栏目....顶级栏目
//找子栏目
function findson($arr,$id=0){
//$id栏目的儿子有哪些呢?
//答数组循环一遍,谁的parent值等于$id,谁就是它儿子
$sons=array(); //子栏目数组
foreach($arr as $v){
if($v['parent']==$id){
$sons[]=$v;
}
}
return $sons;
}
print_r(findson($arr,0));
//找子孙树
//用静态变量
function subtree($arr,$id=0,$lev=1){
//$id栏目的儿子有哪些呢?
//答数组循环一遍,谁的parent值等于$id,谁就是它儿子
static $subs=array(); //子栏目数组
foreach($arr as $v){
//我想子孙数的话,就要把儿子的$id,传过来,看儿子的id里面有没有孙子
$v['lev']=$lev;
if($v['parent']==$id){
$subs[]=$v; //举例说找到的北京的,但是北京下面有没有分类,不知道,需要找一下,所以需要再次调用一下subtree把id传过去array('id'=>'1','name'=>'北京','parent'=>'0'),
subtree($arr,$v['id'],$lev+1);
}
}
return $subs;
}
function subtree($arr,$id=0,$lev=1){
//$id栏目的儿子有哪些呢?
//答数组循环一遍,谁的parent值等于$id,谁就是它儿子
$subs=array(); //子栏目数组
print_r($subs);
foreach($arr as $v){
//我想子孙数的话,就要把儿子的$id,传过来,看儿子的id里面有没有孙子
$v['lev']=$lev;
if($v['parent']==$id){
$subs[]=$v; //举例说找到的北京的,但是北京下面有没有分类,不知道,需要找一下,所以需要再次调用一下subtree把id传过去array('id'=>'1','name'=>'北京','parent'=>'0'),
$subs=array_merge($subs,subtree($arr,$v['id'],$lev+1));
}
}
return $subs;
}
echo '<br />';
//print_r(subtree($arr,0));
$tree=subtree($arr,0,1);
//使用层级方式输出
foreach($tree as $v){
echo str_repeat(' ',$v['lev']),$v['name'],'<br />';
}
在函数中声明的static 静态变量,无论此函数调用多少次,只初始化一次
以后就会直接沿用该变量
这在递归时,很有用
static总结
1:修饰类的属性与方法为静态属性,静态方法
2.static::method,延迟绑定
3.在函数/方法中,声明静态
家谱树如下:
function familytree($arr,$id){
$tree=array();
//把这个id自身找出来
foreach($arr as $v){
if($v['id']==$id){
//判断要不要找父栏目,
if($v['parent']>0){//pareng>0,说明有父栏目
$tree=array_merge($tree,familytree($arr,$v['parent']));
}
$tree[]=$v;
}
}
return $tree;
}
print_r(familytree($arr,8)); //三里->朝阳->北京
家谱树使用迭代:
//迭代,效率比递归高,代码也没多,
//找家谱树推荐用迭代
function tree($arr,$id){
$tree=array();
while($id!=0){
foreach($arr as $v){
if($v['id']==$id){
$tree[]=$v;
$id=$v['parent'];
break;
}
}
}
return $tree;
}
print_r(tree($arr1,8));
使用迭代法查找子孙树
//任务表 先找0的单元,找到北京了 id为1 找parent=1的栏目 朝阳 又找到三里屯和三里
//$task=[0,1,4,6/8]
function subtree($arr,$parent=0){
$task=array($parent); //任务表
$tree=array(); //地区表
while(!empty($task)){
$flag=false;
foreach($arr as $k=>$v){
if($v['parent']==$parent){
$tree[]=$v;
array_push($task,$v['id']);//把最新的地区id入任务栈
$parent=$v['id'];
unset($arr[$k]);//把找到的单元unset掉
$flag=true; //说明找到了子栏目
}
}
if($flag==false){
array_pop($task);
$parent=end($task);
}
print_r($task);
}
return $tree;
}
print_r(subtree($arr,0));
这些都是从燕十八老师讲的商城项目学的 ,感谢燕十八老师的公益课程