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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

在做JSON的时候在PHP中编码多维数组,我注意到一个不同的输出,只需命名其中一个数组,而不是不命名它们。例如:

$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”代替“第二代”的第二注释相同的结果?

提问于
用户回答回答于

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

$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}}
用户回答回答于

在第一个选项中,只有数字索引(0、1和2)。虽然它们没有显式声明,但是php会自动创建它们。

在第二个选项中,您将其中一个索引声明为字符串,这使得PHP在内部将所有索引转换为String。

当您对第一个数组进行编码时,不需要在生成的json字符串中显示整数,因为任何解码器都应该能够“猜测”它们是0、1和2。

但是在第二个数组中,这是必要的,因为解码器必须知道数组中的键值。

扫码关注云+社区