You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP解析可变JSON为HTML表格报错问题修复咨询

问题原因

报错的核心是$request_2中存在非嵌套结构的键值对:比如"Ex. Directo Gram":"Negativo",该键对应的值是字符串而非数组。原代码默认所有section对应的$values都是数组,直接执行foreach($values)时,字符串无法被遍历,因此抛出foreach() argument must be of type array|object警告。

另外注意:$request_2的JSON存在语法错误——"Leucócitos": 15 - 25 /campo没有用双引号包裹值,会导致json_decode解析失败,需先修正为"Leucócitos": "15 - 25 /campo"。

修复方案

修改代码,在遍历每个section的$values前,先判断其是否为数组:

  • 若为数组:按原逻辑遍历子键值对,生成section/name的表头和对应值
  • 若为非数组(字符串/数值等):直接将section名作为表头的一部分,值作为单元格内容
修复后的完整代码
// 先修正$request_2的JSON语法错误
$request_2 = '{
  "URINA II (Exame Sumário da Urina)": {
    "Cor": "Amarela",
    "Aspecto": "Límpido",
    "Densidade": "1.021",
    "pH": "7.0",
    "Proteínas": "Vestígios",
    "Glucose": "Negativo",
    "Corpos Cetónicos": "Negativo",
    "Urobilinogénio": "Negativo",
    "Bilirrubina": "Negativo",
    "Nitritos": "Negativo",
    "Esterase leucocitária (Leucócitos)": "+ +",
    "Hemoglobina": "+ +"
  },
  "Exame do Sedimento": {
    "Células Epiteliais": "0-2/campo",
    "Leucócitos": "15 - 25 /campo",
    "   Eritrócitos ":"15-25/campo"
  },
  "Urina, Exame Microbiológico (Urocultura)": {
    "Células epiteliais":"0-2/campo", 
    "Leucócitos":"15 - 25/campo", 
    "Eritrócitos":"15-25/campo"
  },
  "Ex. Directo Gram":"Negativo", 
  "URINA E DOSEAMENTOS URINÁRIOS": {
    "Ex. Cultural Resultado":"Negativo"
  }
}';

$obj = json_decode($request_2, true);

// 先校验JSON解析是否成功
if (!is_array($obj)) {
    echo "JSON解析失败";
    exit;
}

echo '<table border="1">';
echo '<thead><tr>';
foreach ($obj as $section => $values) {
    if (is_array($values)) {
        foreach ($values as $name => $result) {
            echo "<th>{$section}/{$name}</th>";
        }
    } else {
        // 非数组值,直接用section作为表头
        echo "<th>{$section}</th>";
    }
}
echo '</tr></thead>';
echo '<tbody><tr>';
foreach ($obj as $values) {
    if (is_array($values)) {
        foreach ($values as $result) {
            echo "<td>{$result}</td>";
        }
    } else {
        // 非数组值直接输出
        echo "<td>{$values}</td>";
    }
}
echo '</tr></tbody>';
echo '</table>';
关键说明
  1. JSON校验:添加is_array($obj)判断,避免JSON解析失败时后续代码报错
  2. 类型判断:用is_array($values)区分嵌套数组和直接值,分别处理表头和单元格内容
  3. JSON语法修正:将$request_2中未加引号的数值修正为字符串,确保json_decode能正确解析

内容的提问来源于stack exchange,提问作者Antonio Da Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:30:53