我有一个简单的数组:

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是巧言令色助阵愚蠢的人谁也无法从整数区分字符串,但在这个过程中搞砸任何合法使用字符串作为索引,不管什么样的价值可以变成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top