PHP在JSON中计数节点返回许多


$ONEANSWER = '{
"name": "Attendee terms and conditions",
"id": "1z6wzmd95",
"numberofcolumns": "1",
"type": "check-box",
"answers": {
"answer": {
"@attributes": {
"code": "1z6x061vg",
"revision": "8969663434"
},
"name": "Attendee terms and conditions",
"sort": "0",
"type": "label"
}
}
}';
$THREEANSWERS ='{
"name": "GPP What printing are you responsible for (please select all that apply)?",
"id": "1ygc0dvbi",
"numberofcolumns": "2",
"type": "check-box",
"answers": {
"answer": [
{
"@attributes": {
"code": "1yx7dx07w",
"revision": "8986379556"
},
"name": "Advertising - posters / signage",
"sort": "0",
"type": "label"
},
{
"@attributes": {
"code": "1ygc0eaqt",
"revision": "8986379550"
},
"name": "Books and photo books",
"sort": "1",
"type": "label"
},
{
"@attributes": {
"code": "1yx7dx07y",
"revision": "8986379557"
},
"name": "Décor",
"sort": "2",
"type": "label"
}
]
}
}';

$ONEANSWER =json_decode($ONEANSWER, true);
$THREEANSWERS  =json_decode($THREEANSWERS , true );
echo count($ONEANSWER['answers']);  //expect 1 get 1
echo count($ONEANSWER['answers']['answer']);  //expect 1 get 4
echo count($THREEANSWERS ['answers']); //expect 1 get 1
echo count($THREEANSWERS ['answers']['answer']); //expect 3 get 3

运行上面的返回4,但我期待1。这里有一个1 'array->answers->answer'节点那我怎么得到4呢?

我有完全相同的JSON格式与多个"答案"和相同的方法是返回正确的数量。只有一个答案,却似乎失败了?

感谢

如果是关联数组,则为顺序数组

function isAssoc($array) {
$array = array_keys($array);
return ($array !== array_keys($array));
}
if (isAssoc($ONEANSWER['answers']['answer'])) {
$ONEANSWER['answers']['answer'] = [$ONEANSWER['answers']['answer']];
}
if (isAssoc($THREEANSWERS['answers']['answer'])) {//it's not associative array
$THREEANSWERS['answers']['answer'] = [$THREEANSWERS['answers']['answer']];
}
使用isAssoc

OK仅供参考,因此根据多个评论,'answer'节点在响应JSON中的格式不同,如果有多个'答案',请注意多个答案示例上的方括号。

设置一个数组的答案使它工作

echo count(array($ONEANSWER['answers']['answer'])); //expect 1 get 1

在生产中,我可以检查它是否是一个数组,如果不是,就把它变成一个。

最新更新