【PHP】无限级别分类之查找子孙树

无限级别分类

$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)
    );

无限级别分类牵涉到两个应用,

  1. 指定文章栏目的子孙栏目,即子孙树
  2. 指定栏目的父亲栏目,父父栏目,也就是家谱数目
  3. 找指定栏目的子栏目

第一种方式,直接递归查找

<?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('&nbsp;&nbsp;', $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('&nbsp;&nbsp;', $v['lev']), $v['name'], "<br/>";
}
 ?>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值