无限级分类查找--子孙树,家谱树

 无限级分类查找

复制代码
$area=array(
array('id'=>1,'name'=>'北京','parent'=>0),
array('id'=>2,'name'=>'昌平','parent'=>1),
array('id'=>3,'name'=>'海淀','parent'=>2),
array('id'=>4,'name'=>'天津市','parent'=>0),
array('id'=>5,'name'=>'市辖区','parent'=>4),
array('id'=>6,'name'=>'和平区','parent'=>5),
array('id'=>7,'name'=>'河北省','parent'=>0),
array('id'=>8,'name'=>'石家庄市','parent'=>7),
array('id'=>9,'name'=>'长安区','parent'=>8)
);
复制代码

1:查找子树:找到该节点下的子节点

复制代码
/**
 * 找子树,子节点
 */
function findson($arr,$id=0)
{
    $sons=array();
    foreach ($arr as $value) {
        if ($value['parent']==$id) {
            $sons=$value;
        }
    }
    return $sons;
}

print_r(findson($area,0));
复制代码

2:查找子孙树:找到该节点下的所有子节点以及子节点下的子节点,无限查找,知道没有子节点为止,这个用递归调用来查找。

复制代码
/**
 * 找子孙树
 */
function subtree($arr,$id,$lev=1)
{
     $subs=array();
    foreach ($arr as $value) {
        if ($value['parent']==$id) {
            $value['lev']=$lev;
            $subs[]=$value;
            $subs=array_merge($subs,subtree($arr,$value[id],$lev+1));
        }
    }

    return $subs;

}
复制代码

3:查找家谱树:找到该节点的所有父节点以及通过父节点继续往上查找,此处的递归调用和上面稍稍有点不同,这里的数组处理方式是通过static关键字来操作。

复制代码
/**
 * 家谱树
 */
function familytree($arr,$id)
{static $tree=array();
    foreach ($arr as $value) {
        if ($value['id']==$id) {
            $tree[]=$value;
            if ($value['parent']>0) {
                familytree($arr,$value['parent']);
            }   
        }
    }
    return $tree;

}
复制代码

 

posted @   尼科  阅读(1158)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示