完整的PHP递归类

网上找来的一个递归类,自己做了一些代码的调整。

调用:
makeTree($list,['type'=>$tree,'primary_key'=>'d_id','parent_key'=>'d_pid'])

list为原始数据,[ ]内的是$config参数

class Tree
{

    protected static $config = array(
        /* 主键 */
        'primary_key' 	=> 'id',
        /* 父键 */
        'parent_key'  	=> 'pid',
        /* 展开属性 */
        'expanded_key'  => 'expanded',
        /* 叶子节点属性 */
        'leaf_key'      => 'leaf',
        /* 孩子节点属性 */
        'children_key'  => 'children',
        /* 是否展开子节点 */
        'expanded'    	=> true,
        /* 生成方式 line线性 tree树结构 */
        'tree_type'          => 'line'
    );

    /* 结果集 */
    protected static $result = array();

    /* 层次暂存 */
    protected static $level = array();

    /**
     * 递归
     * @param $data 数据
     * @param array $options 自定义config参数
     * @return array 返回
     */
    public function makeTree($data,$options=array() ){
        $dataset = self::buildData($data,$options);
        extract(self::$config);

        //新接入时,清空结果集
        self::$result = [];
        $r = self::makeTreeCore(0,$dataset,$tree_type);
        return $r;
    }

    /* 格式化数据, 私有方法 */
    private static function buildData($data,$options){
        $config = array_merge(self::$config,$options);
        self::$config = $config;
        extract($config);

        $r = array();
        foreach($data as $item){
            $id = $item[$primary_key];
            $parent_id = $item[$parent_key];
            $r[$parent_id][$id] = $item;
        }

        return $r;
    }

    /* 生成树核心, 私有方法  */
    private static function makeTreeCore($index,$data,$type)
    {
        extract(self::$config);
        foreach($data[$index] as $id=>$item)
        {
            if($type=='tree'){
                if(isset($data[$id]))
                {
                    $item[$expanded_key]= self::$config['expanded'];
                    $item[$children_key]= self::makeTreeCore($id,$data,$type);
                }
                else
                {
                    $item[$leaf_key]= true;
                }
                $r[] = $item;
            }else if($type=='line'){
                $parent_id = $item[$parent_key];
                self::$level[$id] = $index==0?0:self::$level[$parent_id]+1;
                $item['level'] = self::$level[$id];
                self::$result[] = $item;
                if(isset($data[$id])){
                    self::makeTreeCore($id,$data,$type);
                }

                $r = self::$result;
            }else{
                $r = $data;
            }
        }
        return $r;
    }

}

猜你喜欢

转载自blog.csdn.net/myd0512/article/details/88027714