PHP高效的数组生成tree结构的方法

介绍了一种使用PHP生成树形结构数组的有效方法。通过自定义类实现数组转换,提高处理大量数据时的性能。

        最近在用PHP开发项目,由于用到树形结构,而且数据还挺大的;如果树形结构语法写得不当,会导致性能消耗严重,程序运行速度肉眼可见的慢,于是用到下面的类来处理。

        进入正题:

class Tree{
    private $OriginalList;
    public  $pk;//主键字段名
    public  $parentKey;//上级id字段名
    public  $childrenKey;//用来存储子分类的数组key名
    
    function __construct($pk="id",$parentKey="pid",$childrenKey="children"){
        if(!empty($pk) && !empty($parentKey) && !empty($childrenKey)){
            $this->pk=$pk;
            $this->parentKey=$parentKey;
            $this->childrenKey=$childrenKey;
        }else{
            return false;
        }
    
    }
    //载入初始数组
    function load($data){
        if(is_array($data)){
            $this->OriginalList=$data;
        }
    }
    
    /**
     * 生成嵌套格式的树形数组
     * array(..."children"=>array(..."children"=>array(...)))
     */
    function DeepTree($root=0){
        if(!$this->OriginalList){
            return FALSE;
        }
        $OriginalList=$this->OriginalList;
        $tree=array();//最终数组
        $refer=array();//存储主键与数组单元的引用关系
        //遍历
        foreach($OriginalList as $k=>$v){
            if(!isset($v[$this->pk]) || !isset($v[$this->parentKey]) || isset($v[$this->childrenKey])){
                unset($OriginalList[$k]);
                continue;
            }
            $refer[$v[$this->pk]]=&$OriginalList[$k];//为每个数组成员建立引用关系
        }
        //遍历2
        foreach($OriginalList as $k=>$v){
            if($v[$this->parentKey]==$root){//根分类直接添加引用到tree中
                $tree[]=&$OriginalList[$k];
            }else{
                if(isset($refer[$v[$this->parentKey]])){
                    $parent=&$refer[$v[$this->parentKey]];//获取父分类的引用
                    $parent[$this->childrenKey][]=&$OriginalList[$k];//在父分类的children中再添加一个引用成员
                }
            }
        }
        return $tree;
    }
}

调用方法:

$plugin = new Tree("ID","ParentID","children");
$plugin->load($result);
$list = $plugin->DeepTree();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值