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;
    }
原文地址:https://www.cnblogs.com/hgj123/p/6293935.html