PHP解析JSON获取键值对失败,如何生成指定格式输出?
解决PHP解析JSON并生成列表的问题
先帮你梳理下代码里的几个核心问题:
- 变量名拼写错误:你在输出时用了
$value,但循环里定义的变量是$val,这直接导致输出空值; - 未遍历子数组:
$val本身是一个包含多个文件名的数组,你需要嵌套循环才能逐个输出里面的元素; - 可选优化:
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
相关产品推荐
相关产品推荐

