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
相关产品推荐
相关产品推荐

