8

我有一个简单的数组:

array
  0 => string 'Kum' (length=3)
  1 => string 'Kumpel' (length=6)

当我使用 json_encode() 对数组进行编码时,我得到以下信息:

["Kum","Kumpel"] 

我的问题是,得到["Kum","Kumpel"] 而不是的原因是什么{ "0" : "Kum", "1" : "Kumpel" }

4

5 回答 5

22

“{}”括号指定一个对象,“[]”用于根据 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 强制它使用“0,1,2”的原因是因为要将数据分配给对象,您必须将其分配给属性,因为开发人员没有给出属性名称(只有数据),编码器使用数组索引作为属性名称,因为这些是唯一有意义的名称。

注意:根据PHP 手册,选项参数仅适用于 PHP 5.3。

对于较旧的 PHP 版本,请参阅 chelmertz 的答案以获取使 json_encode 使用索引的方法。

于 2009-10-04T08:37:05.963 回答
7

正如 Gumbo 所说,在 JS 方面这无关紧要。要强制 PHP 进入它,试试这个:

$a = new stdClass();
$a->{0} = "Kum";
$a->{1} = "Kumpel";
echo json_encode($a);

不是那么有用,我会坚持使用数组表示法。

于 2009-10-04T08:52:03.940 回答
2

只需将其转换为对象,它就可以正常工作...... JSON_FORCE_OBJECT 参数的作用完全相同。

json_encode((object)$array);

不要忘记将其转换回 php 数组,以便您可以在 php 中访问其值:

$array = (object)$array;
$array = (array)$array;

json_encode($array);
于 2012-07-15T03:48:54.427 回答
0

由于您有一个仅包含数字键的 PHP 数组,因此无需使用 JavaScript 对象。但如果你需要一个,试试 Maiku Mori 的建议。

于 2009-10-04T08:43:58.520 回答
0

我个人认为这是一个需要在 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 试图聪明地帮助那些无法区分字符串和整数的白痴一样,但在这个过程中,任何合法使用字符串作为索引的人都搞砸了,不管值可以变成什么。

于 2016-05-16T19:36:34.437 回答