将稀疏的json对象解码为php数组

时间:2010-03-20 20:48:45

标签: php map json sparse-array

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

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

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

$json = json_encode($myarray);

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

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

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

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

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

3 个答案:

答案 0 :(得分:47)

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

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

$mynewarray = json_decode($json, true);

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

答案 1 :(得分: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))

这可能会带来更好的结果。

答案 2 :(得分: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->10$a->"10"

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

//outputs
string(2) "hi"

作品。

但最有可能的是,正如克里斯所说,你只想传递true作为第二个论点。

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

//outputs
string(2) "hi"