一个原创的比较通用的生成树形结构数组的类

浏览:8070 发布日期:2013/08/09 分类:技术分享
只做了一个核心功能,需要更多功能的请自行扩展。
描述:
假设我们网站分类表有 id(主键) , pid(父id),title,.....等属性,我们需要将所有分类按照树形结构排列,并给每个分类添加一个代表层级的lv属性。
现在我们通过 $M->select();从分类表中读出如下数据。
$list=array(
0=>array('id'=>1,'title'=>'11111','pid'=>0),
1=>array('id'=>2,'title'=>'12222','pid'=>0),
2=>array('id'=>3,'title'=>'33111','pid'=>1),
3=>array('id'=>4,'title'=>'34444','pid'=>2),
);

id为1,2的两个分类是顶级分类,它们的父分类默认为0,层级应该是1;
id为3的分类属于1的子分类,层级应该是2
id=4的是2的子分类,层级同样是2

我们希望经过处理能够形成如下的结构
$tree=array(
0=>array('id'=>1,'title'=>'11111','pid'=>0,'lv'=>1),
2=>array('id'=>3,'title'=>'33111','pid'=>1,'lv'=>2),
1=>array('id'=>2,'title'=>'12222','pid'=>0,'lv'=>1),
3=>array('id'=>4,'title'=>'34444','pid'=>2,'lv'=>2),
);
这样最终方面我们在模板中遍历输出一个有层次的分类列表。其中lv为处理过程中自动计算得到的,可以方面我们在输出的时候str_repeat生成一些划分层次的字符串,例如


通过下面的类即可实现,使用示例
helper('tree');
//关于helper函数,请参考我另外一篇文章http://www.thinkphp.cn/topic/4287.html
$tree=new tree($list,'id','pid','lv');//分别指定主键key,父id的key,以及层级key
dump($tree->tree);//获取树并打印<?php
/**
 * 从数组生成树形结构
 * 可指定自身主键key,父级关联key,层级key,更加灵活。
 */
class tree {
    public $key;//主键id
    public $pkey;//父级id
    public $lvkey;//系统自动添加的,代表层级的数组key
    public $list;//原始数组,二维
    public $tree;//树形数组
    
    function __construct($list,$key='id',$pkey='pid',$lvkey='lv'){
        $this->list=!empty($list)?$list:array();
        $this->key=$key;
        $this->pkey=$pkey;
        $this->lvkey=$lvkey;
        $this->tree=array();
        $this->GetTree();
    }
    
    
    
    /**
     * 将原始数组按树型结构排序
     * @staticvar int $lv 这是一个用于记录当前单元所处层级的静态变量,顶层单元从1开始
     * @param type $pid 指定从哪个父级id开始
     * @return bool
     */
    function GetTree($pid=0){
        if(empty($this->list)){
            return "";
        }
        static $lv=0;
        $lv++;
        foreach($this->list as $k=>$v){
            if(!isset($v[$this->key]) || !isset($v[$this->pkey])){
                continue;
            }
            if($v[$this->pkey]==$pid){
                $v[$this->lvkey]=$lv;
                $this->tree[$v[$this->key]]=$v;
                $this->GetTree($v[$this->key]);
            }
        }
        $lv--;
        return true;
    }
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>