我可以使用以下命令创建一个稀疏的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。)
答案 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"