22

我可以使用以下命令创建一个稀疏的 php 数组(或映射):

$myarray = array(10=>'hi','test20'=>'howdy');

我想将其序列化/反序列化为 JSON。我可以使用以下命令对其进行序列化:

$json = json_encode($myarray);

这导致字符串{"10":"hi","test20":"howdy"}。但是,当我反序列化并使用以下命令将其转换为数组时:

$mynewarray = (array)json_decode($json);

我似乎丢失了任何带有无效 php 标识符的键的映射。也就是说,mynewarray有 mapping 'test20'=>'howdy',但没有10=>'hi'nor '10'=>'hi'

json_encode有没有办法在使用标准/函数从 json 转换和返回时保留 php 映射中的数字键json_decode

(我使用的是 PHP 版本 5.2.10-2ubuntu6.4。)

4

3 回答 3

47

json_decode默认情况下返回 stdClass 类型的对象。您将成员作为属性访问(即$result->test20)。10不是属性的有效名称,这就是您丢失它的原因。

true您可以作为第二个参数传递,而不是强制转换为数组,json_decode以使其返回关联数组本身:

$mynewarray = json_decode($json, true);

如果你这样做,$mynewarray[10]将工作正常。

于 2010-03-20T20:58:09.497 回答
2

什么版本的PHP?在 5.2 以下程序/脚本

$myarray = array(10=>'hi','test20'=>'howdy');
$json = json_encode($myarray);
$mynewarray = (array) json_decode($json);
var_dump($mynewarray);

输出

array(2) {
  ["10"]=>
  string(2) "hi"
  ["test20"]=>
  string(5) "howdy"
}

这不会显示您所描述的行为。

也就是说,如果您的 PHP 版本错误转换了 JSON,请尝试在 json_decode 返回的 stdClass 对象上使用 get_object_vars

get_object_vars(json_decode($json))

这可能会返回更好的结果。

于 2010-03-20T20:59:27.503 回答
2

问题在于从对象到数组的转换。

$a = (array)json_decode('{"10":"hi","test20":"howdy"}');
var_dump($a);

//outputs
array(2) {
  ["10"]=>
     string(2) "hi"
  ["test20"]=>
     string(5) "howdy"
}

看看这个数组有什么索引"10"?但是在 PHP 中,所有看起来像数字的东西都会被转换为数字,尤其是在数组索引中。你不能仅仅a["10"]因为它转换"10"成一个数字而得到,而这个数组没有这样的索引。

但是,foreach有效。

foreach ($a as $key => $value) {
   var_dump($key);
   var_dump($value);
}

//outputs
string(2) "10"
string(2) "hi"
string(6) "test20"
string(5) "howdy"

您还可以将 json_decode 的结果视为对象。虽然你不能做$a->10or $a->"10",

$a = json_decode('{"10":"hi","test20":"howdy"}');
$b = 10;
var_dump($a->$b);

//outputs
string(2) "hi"

作品。

但最有可能的是,正如 Chris 所说,您只想true作为第二个参数传递。

$a = json_decode('{"10":"hi","test20":"howdy"}', true);
var_dump($a[10]);

//outputs
string(2) "hi"
于 2010-03-20T21:20:48.180 回答