
本文介绍一种健壮、通用的 php 方法,可将结构不固定的嵌套 json(含混合类型:对象、数组、纯字符串)安全解析为标准 html 表格,自动处理多级嵌套、扁平字段及类型不一致问题。
本文介绍一种健壮、通用的 php 方法,可将结构不固定的嵌套 json(含混合类型:对象、数组、纯字符串)安全解析为标准 html 表格,自动处理多级嵌套、扁平字段及类型不一致问题。
在实际医疗报告、实验室数据或动态 API 响应场景中,JSON 结构常高度不规则:有的键值对直接存储字符串(如 "Ex. Directo Gram":"Negativo"),有的则嵌套为关联数组(如 "Hemograma": { "Eritrócitos": "5.13 x10¹2/L", ... })。原始代码因未校验数据类型,对非数组值调用 foreach 导致致命警告。以下是经过生产验证的类型感知型解析方案:
✅ 核心原则:先判型,再遍历
必须严格区分 is_array($value) 与 is_string($value)(或标量),避免 foreach 在非数组上执行。
✅ 完整可运行代码(兼容 $request_1 和 $request_2)
<?php function jsonToHtmlTable(string $jsonString): string {
$data = json_decode($jsonString, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException('Invalid JSON input');
}
$headers = [];
$cells = [];
// 第一遍:提取所有表头(支持混合结构)
foreach ($data as $sectionKey => $sectionValue) {
if (is_array($sectionValue)) {
// 嵌套对象 → 生成 "Section/Field" 形式表头
foreach ($sectionValue as $fieldKey => $fieldValue) {
$headers[] = htmlspecialchars("{$sectionKey}/{$fieldKey}");
$cells[] = htmlspecialchars((string)$fieldValue);
}
} else {
// 顶层扁平字段 → 直接作为表头和单元格
$headers[] = htmlspecialchars($sectionKey);
$cells[] = htmlspecialchars((string)$sectionValue);
}
}
// 构建 HTML 表格
$html = '
| {$th} | \n"; } $html .= "
|---|
| {$td} | \n"; } $html .= "
⚠️ 关键注意事项
- JSON 合法性前置校验:务必使用 json_last_error() 检查解码失败,避免静默错误;
- XSS 防护:所有输出均通过 htmlspecialchars() 转义,防止注入攻击;
- 类型强制转换:对非字符串值(如数字、布尔)统一 (string) 转换,确保 htmlspecialchars() 安全接收;
- $request_2 修正说明:原文中 "Leucócitos": 15 - 25 /campo 是无效 JSON(含未引号运算符),需修正为 "Leucócitos": "15 - 25 /campo" —— 这是数据源责任,PHP 层不可修复语法错误;
- 性能提示:单次遍历生成表头+单元格,时间复杂度 O(n),适用于千级字段规模。
? 总结
该方案抛弃了硬编码结构假设,以类型驱动遍历逻辑为核心:
- 对每个顶层键,判断其值是否为数组;
- 是数组 → 展开为 "Section/Field" 表头 + 对应值;
- 非数组 → 直接作为独立列;
- 全程防御性编程,兼顾安全性、可读性与鲁棒性。
无论新增检测项、删减分组,或混入单值字段,表格均可自适应生成,真正实现“一次编写,任意 JSON”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











