php 无限分类 树形数据 格式化
测试demo ------------------------------------------------------------------------------------ <?php function genTree($items,$id='id',$pid='pid',$son = 'children'){ $tree = array(); //格式化的树 $tmpMap = array(); //临时扁平数据 foreach ($items as $item) { $tmpMap[$item[$id]] = $item; } foreach ($items as $item) { if (isset($tmpMap[$item[$pid]])) { $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]]; } else { $tree[] = &$tmpMap[$item[$id]]; } } unset($tmpMap); return $tree; } $items1 = array( array('id' => 1, 'pid' => 0, 'name' => '一级11' ), array('id' => 11, 'pid' => 0, 'name' => '一级12' ), array('id' => 2, 'pid' => 1, 'name' => '二级21' ), array('id' => 10, 'pid' => 11, 'name' => '二级22' ), array('id' => 3, 'pid' => 1, 'name' => '二级23' ), array('id' => 12, 'pid' => 11, 'name' => '二级24' ), array('id' => 9, 'pid' => 1, 'name' => '二级25' ), array('id' => 14, 'pid' => 1, 'name' => '二级26' ), array('id' => 4, 'pid' => 9, 'name' => '三级31' ), array('id' => 6, 'pid' => 9, 'name' => '三级32' ), array('id' => 7, 'pid' => 4, 'name' => '四级41' ), array('id' => 8, 'pid' => 4, 'name' => '四级42' ), array('id' => 5, 'pid' => 4, 'name' => '四级43' ), array('id' => 13, 'pid' => 4, 'name' => '四级44' ), array('id' => 15, 'pid' => 8, 'name' => '五级51' ), array('id' => 16, 'pid' => 8, 'name' => '五级52' ), array('id' => 17, 'pid' => 8, 'name' => '五级53' ), array('id' => 18, 'pid' => 16, 'name' => '六级64' ), ); $time1 = microtime(true); var_dump(genTree($items1)); $time2 = microtime(true); echo "function 时间1:".($time2-$time1); ?> ------------------------------------------------------------------------ 整合TP框架 ------------------------------------------------------------- 控制器端: // 先取出所有的权限 $priModel = D('Privilege'); $data = $priModel->priTree(); $arr = $priModel->genTree($data); 模型端代码: public function priTree(){ $data = $this->select(); return $this->_reSort($data); } #递归对有的分类进行重新排序 public function _reSort($data, $parent_id=0, $level=0){ static $ret = array(); foreach ($data as $k => $v){ if($v['parent_id'] == $parent_id){ // 把level值放到这个分类里,这样就可以知道这个分类是第几级的 $v['level'] = $level; $ret[] = $v; // 再找这个分类的子分类 $this->_reSort($data, $v['id'], $level+1); } } return $ret; } #获取树形结果 public function genTree($items,$id='id',$pid='parent_id',$son = 'children'){ $tree = array(); //格式化的树 $tmpMap = array(); //临时保存数据 foreach ($items as $item) { $tmpMap[$item[$id]] = $item; foreach ($items as $item) { if (isset($tmpMap[$item[$pid]])) { $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]]; } else { $tree[] = &$tmpMap[$item[$id]]; } } unset($tmpMap); return $tree; }