本文详解如何用 php 灵活解析结构不固定的 json 数据(如嵌套对象或混合值类型),自动生成语义清晰、格式统一的 html 表格,兼容多层级键值对、纯字符串字段及空/无效数据场景。
本文详解如何用 php 灵活解析结构不固定的 json 数据(如嵌套对象或混合值类型),自动生成语义清晰、格式统一的 html 表格,兼容多层级键值对、纯字符串字段及空/无效数据场景。
在医疗报告、实验室检测结果等实际业务中,JSON 数据结构常因检测项目不同而动态变化:有的键对应完整对象(如 "Hemograma": { ... }),有的则直接为字符串值(如 "Ex. Directo Gram": "Negativo")。原始代码假设所有子项均为数组,导致 foreach() 在遇到字符串值时抛出 Warning: foreach() argument must be of type array|object, null given 错误。根本原因在于未做类型判断与分支处理。
✅ 正确处理逻辑:双阶段类型感知遍历
核心思路是两次遍历 + 类型判断:
- 第一遍构建表头(<thead>):对每个顶级键(如 "URINA II (Exame Sumário da Urina)"),检查其值是否为数组;若是,则拼接 主键/子键 作为 <th>;若为字符串,则直接用主键作为 <th>。
- 第二遍填充数据(<tbody>):同理判断值类型——数组则遍历其所有值生成 <td>;字符串则直接输出为 <td>。
以下为健壮、可复用的完整实现:
<?php
function jsonToHtmlTable($jsonString): string {
$data = json_decode($jsonString, true);
// 安全校验:确保 JSON 解析成功且为数组
if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) {
return '<p class="error">Invalid or empty JSON data.</p>';
}
ob_start();
?>
<table border="1" class="lab-report-table">
<thead>
<tr>
<?php foreach ($data as $section => $value): ?>
<?php if (is_array($value)): ?>
<?php foreach (array_keys($value) as $field): ?>
<th><?= htmlspecialchars("{$section}/{$field}") ?></th>
<?php endforeach; ?>
<?php else: ?>
<th><?= htmlspecialchars($section) ?></th>
<?php endif; ?>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<tr>
<?php foreach ($data as $value): ?>
<?php if (is_array($value)): ?>
<?php foreach ($value as $cell): ?>
<td><?= htmlspecialchars((string)$cell) ?></td>
<?php endforeach; ?>
<?php else: ?>
<td><?= htmlspecialchars((string)$value) ?></td>
<?php endif; ?>
<?php endforeach; ?>
</tr>
</tbody>
</table>
<?php
return ob_get_clean();
}
// 使用示例
echo jsonToHtmlTable($request_1);
echo jsonToHtmlTable($request_2);
?>⚠️ 关键注意事项
- JSON 格式校验:$request_2 原始内容存在语法错误(如 15 - 25 /campo 缺少引号),PHP json_decode() 会返回 null。务必先用 json_last_error() 检查解析状态,避免后续逻辑崩溃。
- XSS 防护:所有输出均通过 htmlspecialchars() 转义,防止恶意 HTML/JS 注入。
- 空值与类型安全:使用 (string)$cell 强制转换确保数值、布尔值等能正确渲染;对非数组值直接输出,避免 foreach(null) 报错。
- 语义化增强:建议为表格添加 border、class 及 scope="col" 属性(可扩展),提升可访问性与样式控制能力。
该方案完全解耦于具体 JSON 结构,无论是单层扁平化字段(如 "Ex. Directo Gram": "Negativo")还是多级嵌套对象(如 "URINA II": { "Cor": "Amarela", ... }),均可自动适配生成规范表格,真正实现“一次编码,多态兼容”。
立即学习“PHP免费学习笔记(深入)”;



















