| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | <?phpnamespace tools;/** * @name PHPTree * @author crazymus < QQ:291445576 > * @des PHP生成树形结构,无限多级分类 * @version 1.2.0 * @Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) * @updated 2015-08-26 */class Phptree{    protected static $config = array(        /* 主键 */        'primary_key' 	=> 'id',        /* 父键 */        'parent_key'  	=> 'parent_id',        /* 展开属性 */        'expanded_key'  => 'expanded',        /* 叶子节点属性 */        'leaf_key'      => 'leaf',        /* 孩子节点属性 */        'children_key'  => 'children',        /* 是否展开子节点 */        'expanded'    	=> false    );        /* 结果集 */    protected static $result = array();        /* 层次暂存 */    protected static $level = array();    /**     * @name 生成树形结构     * @param array 二维数组     * @return mixed 多维数组     */    public static function makeTree($data, $options=array())    {        $dataset = self::buildData($data, $options);        $r = self::makeTreeCore(0, $dataset, 'normal');        return $r;    }        /* 生成线性结构, 便于HTML输出, 参数同上 */    public static function makeTreeForHtml($data, $options=array())    {        $dataset = self::buildData($data, $options);        $r = self::makeTreeCore(0, $dataset, 'linear');        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='linear')    {        extract(self::$config);        foreach ($data[$index] as $id=>$item) {            if ($type=='normal') {                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;            } elseif ($type=='linear') {                $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;            }        }        return $r;    }}
 |