echo '<pre >';
/***
对于下面这个数组,每个单元有自己的id和地区名
每个单元之间的地位是平等的
因此谈不上谁是谁的上级/下级
$area = array(
array('id'=>1,'name'=>'安徽'),
array('id'=>2,'name'=>'海淀'),
array('id'=>3,'name'=>'濉溪县'),
array('id'=>4,'name'=>'昌平'),
array('id'=>5,'name'=>'淮北'),
array('id'=>6,'name'=>'朝阳'),
array('id'=>7,'name'=>'北京'),
array('id'=>8,'nane'=>'上地');
我们为了表示地区之间的上下级关系,人为的加了一个字段
parent
parent是该栏目的父栏目的__
$area = array(
array('id'=>1,'name'=>'安徽','parent'=>0),
array('id'=>2,'name'=>'海淀','parent'=>7),
array('id'=>3,'name'=>'濉溪县','parent'=>5),
array('id'=>4,'nane'=>'昌平','parent'=>7),
array('id'=>5,'name'=>'淮北','parent'=>1),
array('id'=>6,'name'=>'朝阳','parent'=>7),
array('id'=>7,'name'=>'北京','parent'=>0),
array('id'=>8,'name'=>'上地','parent'=>2)
);
顺着这层关系,我们可以分析出
安徽
淮北
濉溪县
北京
海淀
上地
昌平
朝阳
无限级分类,牵涉2个应用
0是 找指定栏目的子栏目
1是 找指定栏目的子孙栏目,即子孙树
2是 找指定的栏目的父栏目/父父栏目....顶级栏目, 即家谱树
子栏目:只找儿子
子孙栏目:后代都找出来
***/
$area = array(
array('id'=>1,'name'=>'安徽','parent'=>0),
array('id'=>2,'name'=>'海淀','parent'=>7),
array('id'=>3,'name'=>'濉溪县','parent'=>5),
array('id'=>4,'name'=>'昌平','parent'=>7),
array('id'=>5,'name'=>'淮北','parent'=>1),
array('id'=>6,'name'=>'朝阳','parent'=>7),
array('id'=>7,'name'=>'北京','parent'=>0),
array('id'=>8,'name'=>'上地','parent'=>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($area,0));
/*
Array
(
[0] => Array
(
[id] => 1
[name] => 安徽
[parent] => 0
)
[1] => Array
(
[id] => 7
[name] => 北京
[parent] => 0
)
)
*/
// 找子孙树(一)
function subtree1($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)
subtree1($arr,$v['id'],$lev+1);
}
}
return $subs;
}
print_r(subtree1($area,0,1));
//array('id'=>1,'name'=>'安徽','parent'=>0)
// 找子孙树(二)
function subtree2($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),
//subtree2($arr,$v['id'],$lev+1);
$subs = $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 >';
// 重复每行的缩进
}
/*
安徽
淮北
濉溪县
北京
海淀
上地
昌平
朝阳
*/
// 找子孙树(三)
function subtree3($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,subtree3($arr,$v['id'],$lev+1));
// 数组的加法 array_merge
}
}
return $subs;
}
$tree = subtree3($area,0,1);
foreach($tree as $v) {
echo str_repeat(' ',$v['lev']),$v['name'],'<br >';
// 重复每行的缩进
}