空数组字段会导致json_encode的输出类型从JSONArray变为JSONObject


Empty array fields cause json_encode's output type to change from JSONArray to JSONObject

这段代码的输出类型是JSONArray:

for($i=0;$i<4;++$i)
{
    $data[$i]['Name'] = 'myname'.$i;
}
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
header('Content-type: application/json; charset=utf-8');
echo $json;
结果:

[{"Name":"myname0"},{"Name":"myname1"},{"Name":"myname2"},{"Name":"myname3"}]

但是当我跳过其中的一些,它的输出类型将是JSONObject!!:

for($i=0;$i<4;++$i)
{
    $data[$i]['Name'] = 'myname'.$i;
    ++$i;
}
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
header('Content-type: application/json; charset=utf-8');
echo $json;
结果:

{"0":{"Name":"myname0"},"2":{"Name":"myname2"}}

为什么? !

如您所见,它们的字段号将作为这些对象的名称

引自手册:

对数组进行编码时,如果键不是连续的数字序列从0开始,所有键被编码为字符串,和为每个键值对显式指定。

你问题中的第二个例子显然是指上述情况。这就是为什么结果JSON变成了JS object