PHP实现无限极分类生成分类树的方法
原始数据包格式,按城市、区分类树:
$array=array( array('id'=>'1','name'=>'北京市','pid'=>'0'), array('id'=>'2','name'=>'天津市','pid'=>'0'), array('id'=>'3','name'=>'和平区','pid'=>'2'), array('id'=>'4','name'=>'海淀区','pid'=>'1'), array('id'=>'5','name'=>'西北旺','pid'=>'4'), array('id'=>'6','name'=>'马连洼','pid'=>'4'), array('id'=>'7','name'=>'津南区','pid'=>'2'), );
方法一:利用递归方法,实现无限分类树
递归是实现无限极分类的最常用方法,具体方式是将所需的无限分类数据在一次循环中转化为了树形数据。该方法可在无限级别分类下的任意类别下添加子类别。
/** * 递归方法,实现无限分类树 * @param array $array 原始数据包 * @param intval $parentId 当前分类的父级ID * @return array */ public function buildTree($array, $parentId = 0) { if (empty($array)) { return []; } $fotmatTree = array(); foreach($array as $item) { if ($item['pid'] == $parentId) { $fotmatTree[] = array( 'id' => $item['id'], 'name' => $item['name'], 'child' => $this->buildTree($array, $item['id']), ); } } return $fotmatTree; }
方法二:利用迭代器方法,实现无限分类树(推荐此方法,递归方法占用内存大)
该方法与递归方法类似,通常使用无限极分类数组重排的方式生成一个树形数组。由于迭代器特别适用于处理较大的数据集,因此该方法可保持代码的封装性,并且速度较快。
/** * 迭代器方法,实现无限分类树 * @param array $array 原始数据包 * @return array */ public function buildTree($array) { if (empty($array)) { return []; } $map = array(); $fotmatTree = array(); foreach ($array as &$vo) { $map[$vo['id']] = &$vo; $map[$vo['id']]['child'] = array(); } unset($vo); foreach ($array as &$item) { $parent = &$map[$item['pid']]; if (empty($parent)) { $fotmatTree[] = &$item; } else { $parent['child'][] = &$item; } } unset($map); return $fotmatTree; }
分类树结果格式如下:
[ { "id":"1", "name":"北京市", "pid":"0", "child":[ { "id":"4", "name":"海淀区", "pid":"1", "child":[ { "id":"5", "name":"西北旺", "pid":"4", "child":[ ] }, { "id":"6", "name":"马连洼", "pid":"4", "child":[ ] } ] } ] }, { "id":"2", "name":"天津市", "pid":"0", "child":[ { "id":"3", "name":"和平区", "pid":"2", "child":[ ] }, { "id":"7", "name":"津南区", "pid":"2", "child":[ ] } ] } ]