无限级分类之查找子孙树和家谱树

子孙树是用递归查找指定栏目的所有子类,以及子类的子类,查找家谱树是查找制定栏目的父类和父类的父类,一致到顶级类

<?php
$area=array(
    array(‘id‘=>‘1‘,‘name‘=>‘河南‘,‘parent‘=>0),
    array(‘id‘=>‘2‘,‘name‘=>‘吉林‘,‘parent‘=>0),
    array(‘id‘=>‘3‘,‘name‘=>‘北京‘,‘parent‘=>0),
    array(‘id‘=>‘4‘,‘name‘=>‘信阳‘,‘parent‘=>1),
    array(‘id‘=>‘5‘,‘name‘=>‘郑州‘,‘parent‘=>1),
    array(‘id‘=>‘6‘,‘name‘=>‘长春‘,‘parent‘=>2),
    array(‘id‘=>‘7‘,‘name‘=>‘朝阳‘,‘parent‘=>3),
    array(‘id‘=>‘8‘,‘name‘=>‘海淀‘,‘parent‘=>3)
    );
//无限级分类之找子孙树
function subtree($arr,$id,$lev=1){
    static $subs=array();//子孙数组

    foreach ($arr as $v) {
        if($v[‘parent‘]==$id){
            $v[‘lev‘]=$lev;
            $subs[]=$v;
            subtree($arr,$v[‘id‘],$lev+1);
        }
    }
    return $subs;
}
$tree =subtree($area,0,1);
foreach ($tree as $v) {
    echo str_repeat(‘  ‘, $v[‘lev‘]),$v[‘name‘],‘<br/>‘;
}
// 若不用static,可以用array_merge()将数组连接起来
function subtree2($arr,$id,$lev=1){
    $subs=array();//子孙数组

    foreach ($arr as $v) {
        if($v[‘parent‘]==$id){
            $v[‘lev‘]=$lev;
            $subs[]=$v;
            $subs=array_merge($subs,subtree2($arr,$v[‘id‘],$lev+1));
        }
    }
    return $subs;
}
$tree2 =subtree2($area,0,1);
foreach ($tree2 as $v) {
    echo str_repeat(‘  ‘, $v[‘lev‘]),$v[‘name‘],‘<br/>‘;
}

// 无限极分类之查找家谱树
function familytree($arr,$id){
    static $tree=array();

    foreach($arr as $v){
        if($v[‘id‘]==$id){
            //判断要不要找父栏目
            if($v[‘parent‘]>0){
                familytree($arr,$v[‘parent‘]);
            }

            $tree[]=$v;

        }
    }
    return $tree;
}
$fam=familytree($area,4);
print_r($fam);

// 迭代找家谱树
function famtree($arr,$id){
    $tree=array();

    while($id!==0){
        foreach($arr as $v){
            if($v[‘id‘]==$id){
                $tree[]=$v;
                $id=$v[‘parent‘];
                break;
            }
        }
    }

    return $tree;
}
print_r(famtree($area,4));
?>
时间: 2024-08-05 22:56:04

无限级分类之查找子孙树和家谱树的相关文章

无限级分类之查找子孙树

1 <?php 2 header("Content-Type:text/html;charset=utf-8"); 3 $cate=array( 4 array('id'=>1,'name'=>'html','parent'=>0), 5 array('id'=>2,'name'=>'javascript','parent'=>0), 6 array('id'=>3,'name'=>'div+css','parent'=>0)

无限极分类php实现—查子孙树、家谱树

<?php // 无限级分类中,查家谱树 $area = array( 0=>array('cat_id'=>1,'cat_name'=>'北京市','parent_id'=>0), 1=>array('cat_id'=>2,'cat_name'=>'馆陶县','parent_id'=>5), 2=>array('cat_id'=>3,'cat_name'=>'海淀区','parent_id'=>1), 3=>array(

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

无限级分类查找 $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'=>'市辖区','par

无限极分类之查找子孙树

1 <?php 2 3 header('content-type:text/html;charset=utf8'); 4 $area = array( 5 array('id'=>1,'name'=>'安徽','parent'=>0), 6 array('id'=>2,'name'=>'海淀','parent'=>7), 7 array('id'=>3,'name'=>'濉溪县','parent'=>5), 8 array('id'=>4,

无限极分类中,查找子孙树

<?php // 无限级分类中,查找子树树 $area = array( 0=>array('cat_id'=>1,'cat_name'=>'北京市','parent_id'=>0), 1=>array('cat_id'=>2,'cat_name'=>'馆陶县','parent_id'=>5), 2=>array('cat_id'=>3,'cat_name'=>'海淀区','parent_id'=>1), 3=>array

php 无限极分类查找家谱树

1:迭代的效率要比递归高,代码页相对少些,所以查找家谱树推荐用迭代 $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

无限级分类实现思路 (组织树的分级管理)

关于该问题,暂时自己还没有深入研究,在网上找到几种解决方案,各有优缺点. 第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类.这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层. 分析:通过这种数据库设计出的无限级,可以说读取的时候相当费劲,所以大部分的程序最多3-4级分类,这就足以满足需求,从而一次性读出所有的数据,再对得到数组

无限级分类

$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'=>'淮北','paren

夺命雷公狗---无限级分类NO2

<?php header("Content-Type:text/html;charset=utf-8"); /* 无限级分类.牵扯2个应用 0是-找指定栏目的子栏目 1是-找指定栏目的子孙栏目,即子孙树 2是-找指定栏目的父栏目/父父栏目....顶级栏目,即家谱树 */ $aarr = array( array('id'=>1,'name'=>'安徽','pid'=>0), array('id'=>2,'name'=>'海淀','pid'=>7