无限级别分类:
$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)
);
无限级别分类牵涉到两个应用,
- 指定文章栏目的子孙栏目,即子孙树
- 指定栏目的父亲栏目,父父栏目,也就是家谱数目
- 找指定栏目的子栏目
第一种方式,直接递归查找
<?php
function findson($arr, $id) {
$con = array(); //子栏目数组
foreach ($arr as $v) {
if ($v['parent'] == $id) {
$sons[] = $v;
findson($arr, $v['tid']);
}
}
return $sons;
}
print_r(findson1($area, 0));
?>
但是这样会出错,这是因为在递归的时候,都会重新开辟一个新的数组, 这样导致了最终的结果,只是第一次调用的结果。
但是当我们在答案数组前面加上static关键字的时候,我们就可以得到我们想要的答案,这是因为static数组的会一直保留下来
<?php
function findson1($arr, $id) {
static $con = array(); //子栏目数组
foreach ($arr as $v) {
if ($v['parent'] == $id) {
$con[] = $v;
findson1($arr, $v["id"]);
}
}
return $con;
}
print_r(findson1($area, 0));
?>
现在我们继续对结果进行一下优化,因为上面打印出来的并不是很好看,我们可以将每一个答案设置一个级别,然后根据这个级别去输出答案。
<?php
function findson3($arr, $id, $lev = 1) {
static $con = array(); //子栏目数组
foreach ($arr as $v) {
if ($v['parent'] == $id) {
$v['lev'] = $lev;
$con[] = $v; //级别加1
findson3($arr, $v['id'], $lev + 1);
}
}
return $con;
}
$tree = findson3($area, 0, 1);
foreach ($tree as $v) {
echo str_repeat(' ', $v['lev']), $v['name'], "<br/>";
}
?>
其实上面还有一种方案,就是在递归调用的时候,直接在将上面的数组进行归并
<?php
function findson3($arr, $id, $lev = 1) {
$con = array(); //子栏目数组
foreach ($arr as $v) {
if ($v['parent'] == $id) {
$v['lev'] = $lev;
$con[] = $v;
$con = array_merge($con, findson3($arr, $v['id'], $lev + 1));
}
}
return $con;
}
$tree = findson3($area, 0, 1);
foreach ($tree as $v) {
echo str_repeat(' ', $v['lev']), $v['name'], "<br/>";
}
?>