0

0

将扁平数组转换为多层嵌套树结构(基于字符串键而非ID)

碧海醫心

碧海醫心

发布时间:2026-02-18 11:49:00

|

813人浏览过

|

来源于php中文网

原创

将扁平数组转换为多层嵌套树结构(基于字符串键而非ID)

本文详解如何将含 pattern_type_name、pattern_name、marker_description 三字段的扁平数组,按层级关系重构为「类型 → 名称 → 描述」的树形结构,无需id字段,纯靠字符串键自动分组聚合。

本文详解如何将含 pattern_type_name、pattern_name、marker_description 三字段的扁平数组,按层级关系重构为「类型 → 名称 → 描述」的树形结构,无需id字段,纯靠字符串键自动分组聚合。

在实际数据展示场景中(如医学检验项目分类、配置项导航菜单等),我们常遇到结构扁平但语义分明的数据源:它不带显式父子ID,却天然具备层级逻辑——例如 pattern_type_name 表示顶级分类(如“Blood Sugar”),pattern_name 是其下二级分组(如“TEST”),而 marker_description 则是末端叶子节点(如“A/G ratio”)。此时,目标不是渲染HTML,而是构建一个可递归遍历、支持任意深度扩展的嵌套数组结构,便于后续用于JSON API响应、Vue/React组件树或模板引擎渲染。

核心思路:以键为路径,逐层归集

关键在于理解:字符串字段值即天然键名(key),而非需查找的值(value)。因此,转换的本质是将每条记录映射为一条“路径”:

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载
['Blood Sugar']['TEST']['A/G ratio'] → true
['Blood Sugar']['TEST']['Albumin']   → true
['Red Blood Cell']['TEST3']['BUN']   → true

该路径结构天然规避了ID依赖,且自动去重(同名路径重复赋值无副作用)。

实现代码(PHP)

<?php
$data = '[
  {"pattern_type_name":"Blood Sugar","pattern_name":"TEST","marker_description":"A\/G ratio"},
  {"pattern_type_name":"Blood Sugar","pattern_name":"TEST","marker_description":"Albumin"},
  {"pattern_type_name":"Blood Sugar","pattern_name":"TEST","marker_description":"Alk Phos"},
  {"pattern_type_name":"Red Blood Cell","pattern_name":"TEST3","marker_description":"A\/G ratio"},
  {"pattern_type_name":"Red Blood Cell","pattern_name":"TEST3","marker_description":"Albumin"},
  {"pattern_type_name":"Cardiovascular","pattern_name":"TEST1","marker_description":"EX3DWSQ"},
  {"pattern_type_name":"Red Blood Cell","pattern_name":"TEST4","marker_description":"FEXTAFIX"}
]';

// 1. 解析原始JSON为关联数组
$table = json_decode($data, true);

// 2. 构建三层嵌套树结构(键驱动,无ID)
$tempTable = [];
foreach ($table as $row) {
    $type = trim($row['pattern_type_name']); // 建议清洗空格
    $name = trim($row['pattern_name']);
    $desc = trim($row['marker_description']);

    // 自动创建多维键路径,值设为true(仅占位,可替换为完整对象)
    $tempTable[$type][$name][$desc] = true;
}

// 3. 可选:转换为标准树形数组(含label/value等字段,便于前端消费)
$tree = [];
foreach ($tempTable as $type => $names) {
    $typeNode = [
        'label' => $type,
        'children' => []
    ];
    foreach ($names as $name => $descriptions) {
        $nameNode = [
            'label' => $name,
            'children' => array_map(function($desc) {
                return ['label' => $desc, 'isLeaf' => true];
            }, array_keys($descriptions))
        ];
        $typeNode['children'][] = $nameNode;
    }
    $tree[] = $typeNode;
}

// 输出结果(JSON格式化便于查看)
header('Content-Type: application/json; charset=utf-8');
echo json_encode($tree, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>

输出示例(精简版)

[
  {
    "label": "Blood Sugar",
    "children": [
      {
        "label": "TEST",
        "children": [
          {"label": "A/G ratio", "isLeaf": true},
          {"label": "Albumin", "isLeaf": true},
          {"label": "Alk Phos", "isLeaf": true}
        ]
      }
    ]
  },
  {
    "label": "Red Blood Cell",
    "children": [
      {
        "label": "TEST3",
        "children": [{"label": "A/G ratio", "isLeaf": true}, ...]
      },
      {
        "label": "TEST4",
        "children": [{"label": "FEXTAFIX", "isLeaf": true}]
      }
    ]
  }
]

注意事项与最佳实践

  • 键值清洗:务必对 $row['pattern_type_name'] 等字段调用 trim(),避免因前后空格导致同一分类被拆分为多个键;
  • 空值防御:生产环境应增加 isset() 或 array_key_exists() 检查,防止缺失字段报错;
  • 性能考量:若数据量超万级,建议改用 SplFixedArray 或流式处理;当前方案时间复杂度为 O(n),空间复杂度为 O(唯一路径数);
  • ⚠️ 避免过度嵌套:本例固定三层,若未来新增字段(如 sub_category),只需扩展 $tempTable[$a][$b][$c][$d] 即可,但需同步更新遍历逻辑;
  • ? 扩展性提示:如需保留原始数据对象(不止 true),可将 $tempTable[$type][$name][$desc] = $row;,此时叶子节点即为完整数据行。

此方法摒弃了传统ID递归或多次 array_filter 的低效循环,以“键即路径”的思维直击本质,简洁、健壮、易维护,是处理无ID层级数据的推荐范式。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

553

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1553

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号