/*
无限极分类之递归找家谱树
家谱树的应用:如面包屑导航
*/
echo ''
;
$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)
);
/*
先来人肉 上地 的家谱树
北京
海淀
上地
上地[parent==2]
海淀[id==2,parent==7]
北京[id==7,parent==0]
parent==0,到头
*/
家谱树(一) 先找出上地
function familytree1($arr,$id) {
$tree = array();
foreach($arr as $v) {
if($v['id'] == $id) {
$tree = $v; // 以找到上地为例
}
}
return $tree;
}
print_r(familytree1($area,8));
/*
Array
(
[id] => 8
[name] => 上地
[parent] => 2
)
*/
家谱树(二) 判断上地有没父栏目并将其父栏目也找出来
function familytree2($arr,$id) {
static $tree = array();
foreach($arr as $v) {
if($v['id'] == $id) {
$tree[] = $v; // 以找到上地为例
// 判断要不要找父栏目
if($v['parent'] > 0) { // parent>0,说明有父栏目
familytree2($arr,$v['parent']);
}
}
}
return $tree;
}
print_r(familytree2($area,8));
/*
Array
(
[0] => Array
(
[id] => 8
[name] => 上地
[parent] => 2
)
[1] => Array
(
[id] => 2
[name] => 海淀
[parent] => 7
)
[2] => Array
(
[id] => 7
[name] => 北京
[parent] => 0
)
)
*/
家谱树(三) 升级一下代码
function familytree3($arr,$id) {
static $tree = array();
foreach($arr as $v) {
if($v['id'] == $id) {
$tree[] = $v; // 以找到上地为例
// 判断要不要找父栏目
if($v['parent'] > 0) { // parent>0,说明有父栏目
array_merge($tree,familytree3($arr,$v['parent']));
}
}
}
return $tree;
}
print_r(familytree3($area,8));
/*
Array
(
[0] => Array
(
[id] => 8
[name] => 上地
[parent] => 2
)
[1] => Array
(
[id] => 2
[name] => 海淀
[parent] => 7
)
[2] => Array
(
[id] => 7
[name] => 北京
[parent] => 0
)
)
上地->海淀->北京
*/
家谱树(四) 将输出顺序颠倒过来,符合正常寻找顺序
function familytree4($arr,$id) {
static $tree = array();
foreach($arr as $v) {
if($v['id'] == $id) {
// 判断要不要找父栏目
if($v['parent'] > 0) { // parent>0,说明有父栏目
array_merge($tree,familytree4($arr,$v['parent']));
}
$tree[] = $v; // 以找到上地为例
}
}
return $tree;
}
print_r(familytree4($area,8));
/*
Array
(
[0] => Array
(
[id] => 7
[name] => 北京
[parent] => 0
)
[1] => Array
(
[id] => 2
[name] => 海淀
[parent] => 7
)
[2] => Array
(
[id] => 8
[name] => 上地
[parent] => 2
)
)
北京->海淀->上地
*/