PHP统计JSON单answer节点时count返回4的计数异常问题
问题产生原因
这是XML转JSON类接口的典型兼容坑,核心问题是同名字段在单条、多条场景下返回的结构不统一:
- 当存在3个
answer节点时,JSON中answer字段为数组格式,经json_decode($str, true)解析后得到索引数组,每个元素对应一个answer选项,此时count()统计的是数组元素总数,返回结果3和预期一致。 - 当仅存在1个
answer节点时,JSON中answer字段直接为对象格式,解析后得到的是存单个answer属性的关联数组,数组内共4个键:@attributes、name、sort、type,这就是你拿到返回值4的原因——此时你统计的不是answer的数量,是单个answer对象自身的属性个数,结果自然不符合预期。
你贴的JSON里带@attributes字段,明显是SimpleXML这类XML解析工具直接转JSON输出的,这类工具默认不会自动把单元素节点包成数组,非常容易出现这类单/多节点结构不一致的问题。
修复方案
根据你是否能控制上游接口逻辑,二选一即可:
- 方案1(下游兼容,无需修改上游):封装统一的格式化方法,在计数、遍历answer列表前先判断节点结构,如果识别到是单条answer的关联数组,就手动包成一层索引数组再处理。判断逻辑可以直接检测节点下是否存在
@attributes键:单条answer节点必然携带这个属性,而多条场景下answer是索引数组,数组第一层不会存在这个键。
参考实现:
/** * 统一格式化answer节点为标准列表结构 * @param mixed $answerRaw 解析后的原始answer节点内容 * @return array 标准化后的answer选项列表 */ function normalizeAnswerList($answerRaw) { // 识别为单条answer结构,包装成数组返回 if (is_array($answerRaw) && isset($answerRaw['@attributes'])) { return [$answerRaw]; } // 多条answer结构直接返回,异常空值返回空数组 return is_array($answerRaw) ? $answerRaw : []; } // 调用测试 $oneAnswerList = normalizeAnswerList($ONEANSWER['answers']['answer']); echo count($oneAnswerList); // 输出1,符合预期 $threeAnswerList = normalizeAnswerList($THREEANSWERS['answers']['answer']); echo count($threeAnswerList); // 输出3,符合预期
- 方案2(根源解决,可控制上游逻辑时使用):修改上游JSON生成规则,无论
answer节点有1个还是多个,都统一用数组格式输出,禁止单节点时直接返回对象,从根源上消除结构不一致的问题,下游业务代码不需要做额外兼容判断。
内容的提问来源于stack exchange,提问作者megaSteve4
相关产品推荐
相关产品推荐

