PHP无限极分类-一次循环模式(不使用递归)

在平时工作中, 经常需要将普通列表数据, 处理成树, 列表数据结构大致如下:


+----+--------------+-----+
| id | name         | pid |
+----+--------------+-----+
|  1 | 媒体(白名单) |   0 |
|  2 | 党媒公共平台 |   0 |
|  3 | 政府机构     |   0 |
|  4 | 其他         |   0 |
|  5 | 中央媒体     |   1 |
|  6 | 地方媒体     |   1 |
|  7 | 门户媒体     |   4 |
|  8 | 综合媒体     |   4 |
|  9 | 专业媒体     |   4 |
| 11 | 河北省       |   6 |
| 12 | 山东省       |   6 |
| 13 | 辽宁省       |   6 |
| 34 | 北京         |   6 |
| 45 | 视频         |   9 |
| 46 | 教育         |   9 |
| 79 | 法律         |   9 |
| 80 | 其他         |   9 |
| 81 | 文学         |   9 |
+----+--------------+-----+

常规实现方式是使用递归模式, 但是在笔者工作中, 需要处理很大的数据量, 使用递归, 会严重影响性能,  而用一次循环方式也可以很好的处理在处理大数据量时, 性能会提示非常多

完整代码如下

 &$item){
        // 获取出每一条数据的父id
        $pid = &$item['pid'];
        // 将每一个item的引用保存到$map中
        $map[$item['id']] = &$item;
        // 如果在map中没有设置过他的pid, 说明是根节点, pid为0,
        if(!isset($map[$pid])){
            // 将pid为0的item的引用保存到$res中
            $res[$id] = &$item;
        }else{
            // 如果在map中没有设置过他的pid, 则将该item加入到他父亲的叶子节点中
            $pItem = &$map[$pid];
            $pItem[$childKey][] = &$item;
        }
    }
    return $res;
}

最终处理结果如下:
PHP无限极分类-一次循环模式(不使用递归)_第1张图片

你可能感兴趣的:(PHP)