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 |
+----+--------------+-----+

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

完整代码如下

<?php

header('Content-Type:application/json;charset=UTF-8');
$src = '[{"id":"1","name":"媒体(白名单)","pid":"0"},{"id":"2","name":"党媒公共平台","pid":"0"},{"id":"3","name":"政府机构","pid":"0"},{"id":"4","name":"其他","pid":"0"},{"id":"5","name":"中央媒体","pid":"1"},{"id":"6","name":"地方媒体","pid":"1"},{"id":"7","name":"门户媒体","pid":"4"},{"id":"8","name":"综合媒体","pid":"4"},{"id":"9","name":"专业媒体","pid":"4"},{"id":"11","name":"河北省","pid":"6"},{"id":"12","name":"山东省","pid":"6"},{"id":"13","name":"辽宁省","pid":"6"},{"id":"34","name":"北京","pid":"6"},{"id":"45","name":"视频","pid":"9"},{"id":"46","name":"教育","pid":"9"},{"id":"79","name":"法律","pid":"9"},{"id":"80","name":"其他","pid":"9"},{"id":"81","name":"文学","pid":"9"}]';

$result = json_decode($src, true);
echo json_encode(listToTree($result), JSON_UNESCAPED_UNICODE);

/**
 * 核心函数, 将列表数据转化树形结构
 * 使用前提必须是先有父后有子, 即儿子的id必须小于父亲id
 * 列表数据必须安装id从小到大排序
 * @param $lists 原始列表数据
 * @param string $childKey 字段名
 * @return array 返回树形数据
 */
function listToTree($lists, $childKey = 'children'){
    $map = [];
    $res = [];
    foreach($lists as $id => &$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;
}

最终处理结果如下:


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 4月19日早上,小悦悦睡得很香,前两天我一起床,小家伙就醒了,不停的找妈妈,喊着要我再陪她睡一会,今天很奇怪,我都...
    罗江悦妈妈阅读 356评论 0 0
  • 我们太多人活在过去,可是回不去了,很多人又计划着未来,却还没有来到,一种是不甘心舍不得放下,一种是过于在意又惴惴不...
    荣者政来阅读 254评论 0 0
  • 乾圆坤方,万事守常,尔何心燥,徒添烦恼,宇宙无极,浮沉缥缈,何来烦忧,心纳宇外宇宙外宙。芥子须弥,搬山移海,静若处...
    简奋青森阅读 365评论 0 0

友情链接更多精彩内容