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

PHP中如何遍历由MySQL GROUP_CONCAT生成的JSON字符串

解决GROUP_CONCAT生成的JSON字符串无法在PHP中解码遍历的问题

你遇到的问题根源很明确:你从MySQL拿到的portfolios字段内容,并不是标准的JSON格式。JSON规范要求对象的键必须用双引号包裹,但你生成的字符串里是name:"Branch GBD_1.pdf"这种无引号的键,json_decode()碰到这种非标准格式就会解析失败,返回null,自然没法遍历。

给你两种解决思路,按需选择:

方法一:从MySQL端生成标准JSON(推荐)

直接修改你的GROUP_CONCAT语句,在拼接的时候给键名加上双引号,从源头生成符合规范的JSON。

假设你原来的SQL是类似这样的:

GROUP_CONCAT(CONCAT('{name:"', your_name_field, '", img_path:"', your_imgpath_field, '"}') SEPARATOR ',') AS portfolios

把它改成:

GROUP_CONCAT(CONCAT('{"name":"', your_name_field, '", "img_path":"', your_imgpath_field, '"}') SEPARATOR ',') AS portfolios

这样生成的portfolios内容就是标准JSON了,你的原PHP代码不需要修改,直接就能正常解析遍历。

方法二:在PHP端修复非标准JSON(应急方案)

如果暂时没法修改MySQL查询,那就在PHP里先把字符串转换成标准格式再解码。可以用正则表达式给无引号的键名加上双引号:

foreach($records as $r) {
    // 修复JSON格式:匹配无引号的键名,替换成带双引号的
    $fixedJson = preg_replace('/(\w+):/', '"\1":', $r['portfolios']);
    $varArray = json_decode($fixedJson, true);
    
    // 先判断解析是否成功,避免报错
    if(is_array($varArray)){
        foreach($varArray as $que) {
            echo $que['name'].' '.$que['img_path'];
            echo '<br/>';
        }
    } else {
        echo ' portfolios 解析失败,请检查格式';
    }
}

这个正则会匹配所有字母数字下划线组成的键名,给它们加上双引号,让json_decode能正确识别。

注意:方法一更稳妥,因为字符串替换可能会有边缘情况(比如键名里有特殊字符),从数据库端生成标准JSON是最可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:36:03