在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}};
为什么第一个选项不会返回与第二个execpt相同的结果,而“1”代替“secondarray”
答案 0 :(得分:28)
在JSON中,数组[]
只有每个都有数字键,而对象{}
有字符串属性。在第二个示例中包含数组键会强制整个外部结构成为对象。由于包含了字符串键a,b,c,d
。
如果您在第一个示例中使用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}}
答案 1 :(得分:1)
具有连续数字键的数组被编码为JSON数组。就是这样。为什么?因为它是有道理的。
由于密钥可以通过数组编码隐式表示,因此没有理由将它们显式编码为对象密钥。
查看json_encode
documentation中的所有示例。
答案 2 :(得分:0)
在第一个选项中,您只有数字索引(0,1和2)。虽然它们没有显式声明,但php会自动创建它们。
在第二个选项中,您将其中一个索引声明为字符串,这使得PHP在内部将所有索引转换为字符串。
当你对第一个数组进行json编码时,没有必要在生成的json字符串中显示整数,因为任何解码器都应该能够“猜测”它们是0,1和2。
但是在第二个数组中,这是必要的,因为解码器必须知道数组中的键值。
这很简单。数组中没有声明索引?他们是0,1,2,3等等。
答案 3 :(得分:0)
以json形式的输出是year1 {a,b},year2 {c},year3 {d} ** a分别将值1,b = 2,c = 3,d = 4存储在year1的a,b years2的c和years3的d中
$array1 = array('a'=>1, 'b'=>2);
$array2 = array('c'=>3);
$array3 = array('d'=>4)
$form = array("year1" =>$array1,
"year2" =>$array2,
"year3" =>$array3,
);
$data = json_encode($form);