原始数据包格式,按城市、区分类树:
$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":[ ] } ] } ]