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

PHP解析JSON获取键值对失败,如何生成指定格式输出?

解决PHP解析JSON并生成列表的问题

先帮你梳理下代码里的几个核心问题:

  1. 变量名拼写错误:你在输出时用了$value,但循环里定义的变量是$val,这直接导致输出空值;
  2. 未遍历子数组:$val本身是一个包含多个文件名的数组,你需要嵌套循环才能逐个输出里面的元素;
  3. 可选优化:json_decode默认返回stdClass对象,加第二个参数true转成关联数组,操作起来会更符合数组遍历的习惯。

基础修正后的代码(直接解析JSON字符串)

// 解码为关联数组(第二个参数true)
$json = json_decode('{"S01":["001.cbf","002.cbf","003.cbf","004.cbf","005.cbf","006.cbf","007.cbf","008.cbf","009.cbf"],"S02":["001.sda","002.sda","003.sda"],"S03":["001.klm","002.klm"]}', true);

// 遍历外层的分组键
foreach($json as $key => $files) {
    echo 'KEY IS: ' . $key . '<br>';
    // 遍历当前分组下的所有文件名
    foreach($files as $file) {
        echo 'VALUE IS: ' . $file . '<br>';
    }
}

结合MySQL读取JSON并生成ul/li列表

如果JSON存储在MySQL中,假设你的表字段是json_data(可以是TEXT或JSON类型),读取并生成列表的代码如下:

// 用PDO连接数据库(也可以用mysqli,按需替换)
$pdo = new PDO('mysql:host=localhost;dbname=your_database;charset=utf8mb4', 'your_username', 'your_password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 查询目标数据(替换为你的实际查询条件)
$stmt = $pdo->query("SELECT json_data FROM your_table WHERE id = 1");
$row = $stmt->fetch(PDO::FETCH_ASSOC);

// 解码JSON:如果是MySQL JSON类型,取出的直接是数组,可跳过此步;TEXT类型则需要解码
$jsonData = json_decode($row['json_data'], true);

// 生成嵌套的ul/li列表
echo '<ul>';
foreach($jsonData as $section => $files) {
    echo '<li>' . $section . '<ul>';
    foreach($files as $file) {
        echo '<li>' . $file . '</li>';
    }
    echo '</ul></li>';
}
echo '</ul>';

额外注意事项

  • 如果你的MySQL版本是5.7及以上,建议用JSON类型存储数据,取出后无需额外解码;
  • 可以用json_last_error()检查JSON解码是否出错,避免因无效JSON导致的空结果;
  • 原代码里的if ($key)和if ($val)判断没必要,因为你的JSON结构里键和数组都是非空的。

内容的提问来源于stack exchange,提问作者Igor Petev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:08:07