我正在从
JSON转换为对象,从对象转换为数组.这不是我预期的,你可以向我解释吗?
$json = '{"0" : "a"}'; $obj = json_decode($json); $a = (array) $obj; print_r($a); echo("a0:".$a["0"]."<br>"); $b = array("0" => "b"); print_r($b); echo("b0:".$b["0"]."<br>");
这里的输出是:
Array ( [0] => a ) a0: Array ( [0] => b ) b0:b
我会期待a0:a在第一行的结尾.
编辑:阅读答案后,我扩展了代码,这使得行为更加清晰:
//extended example $json = '{"0" : "a"}'; $obj = json_decode($json); $a = (array) $obj; var_export($a); echo("a0:".$a["0"]."<br>"); //this line does not work,see the answers echo $obj->{"0"}."<br>"; //works! $json = '{"x" : "b"}'; $obj = json_decode($json); $b = (array) $obj; var_export($b); echo("bx:".$b["x"]."<br>"); $c = array("1" => "c"); var_export($c); echo("c1:".$c["1"]."<br>"); $d = array("0" => "d"); var_export($d); echo("d0:".$d["0"]."<br>");
输出扩展示例:
array ( '0' => 'a',)a0: a array ( 'x' => 'b',)bx:b array ( 1 => 'c',)c1:c array ( 0 => 'd',)d0:d
this older question中有更多的信息.简短的版本是,PHP对象/类上的
properties遵循相同的
naming convention as variables.对于PHP对象,数值属性无效,因此在从另一种语言序列化对象时应该发生什么,json / javascript)具有数字键.尽管上述情况似乎是显而易见的,但有不同偏见的人则认为PHP在这种情况下的行为是完全有效和优先的.
所以,这是一个错误,但更多的是一个未定义的规范区域,没有明确的答案,所以不要指望行为改变以满足你的喜好,如果它改变,不要指望这个变化是永久的.
header('Content-Type: text/plain'); $json = '{"0" : "a"}'; $obj = json_decode($json); $a = (array) $obj; var_dump($a); var_dump(array(0=>'a')); var_dump(array('0'=>'a'));
那会输出这样的东西
array(1) { ["0"]=> string(1) "a" } array(1) { [0]=> string(1) "a" } array(1) { [0]=> string(1) "a" }
具有单个字符串键值的数组不是有效的PHP构造.如果您尝试创建一个PHP,则会将零转换为int.当你要求PHP做一个转换时,它没有一个定义,它最终创建一个带有字符串键的数组(因为这里应该发生什么不正确的规则).