当在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”代替“secondarray”
4条答案
按热度按时间g52tjvyc1#
在JSON中,数组
[]
只有数字键,而对象{}
有字符串属性。第二个示例中包含的数组键强制整个外部结构必须是一个对象。由于包含字符串键a,b,c,d
,所以两个示例的内部对象都是对象。如果在第一个示例中使用
JSON_FORCE_OBJECT
选项,则应返回与第二个示例类似的结构,其外部结构是对象而不是数组。如果没有指定要将其作为对象,外部数组中缺少字符串键会导致PHP假定它将被编码为JSON中的等效数组结构。gupuwyp22#
具有连续数字键的数组被编码为JSON数组。就是这样为什么?因为这说得通。
由于键可以通过数组编码隐式地表示,因此没有理由将它们显式地编码为对象键。
查看
json_encode
documentation中的所有示例。vsikbqxv3#
在第一个选项中,只有数字索引(0、1和2)。虽然它们没有显式声明,但php会自动创建它们。
在第二个选项中,您将其中一个索引声明为字符串,这使得PHP在内部将所有索引转换为字符串。
当你对第一个数组进行json编码时,没有必要在生成的json字符串中显示整数,因为任何解码器都应该能够“猜测”它们是0、1和2。
但是在第二个数组中,这是必要的,因为解码器必须知道数组中的键值。
很简单数组中没有声明索引?它们是0,1,2,3等等。
bxpogfeg4#
json格式的输出是year 1 {a,B},year 2 {c},year 3 {d}**a的值为1,b=2,c=3,d=4,分别存储在year 1的a,b years 2的c和years 3的d的数组中