题
我有一个简单的数组:
array
0 => string 'Kum' (length=3)
1 => string 'Kumpel' (length=6)
当我使用json_encode(),我得到以下所述阵列编码:
["Kum","Kumpel"]
我的问题是,是什么让["Kum","Kumpel"]
代替{ "0" : "Kum", "1" : "Kumpel" }
的原因是什么?
解决方案
“{}”括号指定对象和“[]”被用于根据JSON规范阵列。数组没有枚举,如果从内存分配的角度看它。这只是数据,然后更多的数据,从另一方面对象具有名称属性和数据分配给特性,因此编码这样的对象,你还必须通过正确的属性名称。但对于数组,你不需要指定索引,因为他们总是将0到n,其中n是数组的长度 - 1,重要的是数据的顺序的唯一的事。
$array = array("a","b","c");
json_encode($array); // ["a","b","c"]
json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"}
为什么JSON_FORCE_OBJECT foces它用“0,1,2”,是因为分配数据obeject您必须将它,分配给属性,因为没有属性名被开发商(仅数据)给出的编码器使用数组的原因指标作为属性名称,因为只有这些名字这将是有意义的。
注意:根据 PHP手册中的选项的参数仅可从PHP 5.3
对于老版本PHP参考chelmertz的答案一种方法,使json_encode使用索引。的
其他提示
正如所述秋葵,在JS-侧都不会有问题。要强制PHP进去,试试这个:
$a = new stdClass();
$a->{0} = "Kum";
$a->{1} = "Kumpel";
echo json_encode($a);
这并不是说可用,我会与阵列符号粘
只投作为一个对象,它会正常工作......在JSON_FORCE_OBJECT参数不完全一样的东西。
json_encode((object)$array);
不要忘了将它转换回PHP数组,因此您可以在PHP访问它的值:
$array = (object)$array;
$array = (array)$array;
json_encode($array);
既然你有只数字键一个PHP数组,就没有必要使用JavaScript对象。但是如果你需要一个,尝试Maiku森的建议。
我个人认为这是需要被固定在PHP的错误。 JSON_FORCE_OBJECT绝对不是一个答案。如果你试图做任何形式的你得到不断地绊倒了泛型编程的。例如,以下是有效的PHP:
阵列( “0”=>数组(0,1,2,3), “1”=>数组(4,5,6,7));
和应该被转换成
{ “0”:[0,1,2,3], “1”:[4,5,6,7]}
然而PHP希望我要么接受
[[0,1,2,3],[4,5,6,7]]
或
{ “0”:{ “0”:1, “1”:1, “2”:2 “3”:3}, “1”:{ “0”:4 “1”:5 , “2”:6, “3”:7}}
两者都没有权利的。我怎么可能像解码一个对象?什么可能的原因是有永远改变,这显然是使用字符串作为索引的东西吗?这就像PHP是巧言令色助阵愚蠢的人谁也无法从整数区分字符串,但在这个过程中搞砸任何合法使用字符串作为索引,不管什么样的价值可以变成。