* @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; } }