多维数组的JSON_ENCODE,给出不同的结果

2022-08-30 16:38:30

在 PHP 中执行json_encode多维数组时,我注意到只需命名其中一个数组,而不是不命名它们,就会发现不同的输出。例如:

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));
json_encode($arrytest)

给出多个 json 对象的单个数组

[{"a":1,"b":2},{"c":3},{"d":4}];

而只是简单地为中间数组分配一个名称

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4));
json_encode($arrytest)

创建一个包含多个 json 对象的 json 对象

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}};

为什么第1个选项不会返回与第2个执行器相同的安慰,用“1”代替“secondarray”


答案 1

在 JSON 中,只有数组具有每个数组的数字键,而对象具有字符串属性。在第二个示例中包含数组键会强制整个外部结构成为一个对象。由于包含字符串键,两个示例的内部对象都作为对象。[]{}a,b,c,d

如果要在第一个示例中使用该选项,则应返回与第二个示例类似的结构,其中外部结构是对象而不是数组。如果不指定要将其作为对象,则外部数组中没有字符串键会导致 PHP 假定要将其编码为 JSON 中的等效数组结构。JSON_FORCE_OBJECT

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));

// Force the outer structure into an object rather than array
echo json_encode($arrytest , JSON_FORCE_OBJECT);

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}}

答案 2

具有连续数字键的数组被编码为 JSON 数组。事情就是这样。为什么?因为它是有道理的。

由于键可以通过数组编码隐式表示,因此没有理由将它们显式编码为对象键。

请参阅json_encode文档中的所有示例。