我的PHP代码中有一些非常奇怪的行为。我不知道这是否真的是一个很好的问题,因为它几乎看起来像PHP中的一个错误。我在我的一个项目中遇到了这个问题,并将问题隔离开来:
// json object that will be converted into an array
$json = '{"5":"88"}';
$jsonvar = (array) json_decode($json); // notice: Casting to an array
// Displaying the array:
var_dump($jsonvar);
// Testing if the key is there
var_dump(isset($jsonvar["5"]));
var_dump(isset($jsonvar[5]));
该代码输出以下内容:
array(1) {
["5"]=>
string(2) "88"
}
bool(false)
bool(false)
最大的问题:这两个测试都应该产生bool(true) - 如果使用常规的php数组创建相同的数组,这就是你会看到的:
// Let's create a similar PHP array in a regular manner:
$phparr = array("5" => "88");
// Displaying the array:
var_dump($phparr);
// Testing if the key is there
var_dump(isset($phparr["5"]));
var_dump(isset($phparr[5]));
输出:
array(1) {
[5]=>
string(2) "88"
}
bool(true)
bool(true)
所以这并没有多大意义。我已经在两个不同的PHP / apache安装上测试了这个。
您可以自己将代码复制粘贴到php文件中进行测试。
它必须与从对象到数组的转换有关。
答案 0 :(得分:5)
使用json_decode函数参数获取数组,而不是自己更改对象。
json_decode ( string $json [, bool $assoc = false])
$assoc - When TRUE, returned object s will be converted into associative array s.
您的代码,更改为
$jsonvar = json_decode($json, true);
按预期工作
答案 1 :(得分:3)
可以进一步简化这个问题
$o = new stdClass;
$o->{5} = 1; //or even $o->{'5'} = 1;
$a = (array) $o;
print_r($a); // Array([5] => 1)
var_dump(isset($a[5])); // false
var_dump(isset($a['5'])); // false
似乎只有当属性名称是php通常认为是数组中的数字键时才会发生这种情况。
对我来说绝对出乎意料的行为。
编辑 同样的问题在这里 Casting an Array with Numeric Keys as an Object
编辑#2 记录的行为 http://www.php.net/manual/en/language.types.array.php#language.types.array.casting
答案 2 :(得分:2)
正如克里斯所说,你正在达到json< - >的极限之一。对象< - >数组映射。
要记住的另一个有趣的问题是当json对象中的键是空字符串时。
json = '{"":"88"}';
密钥将映射到php为“ empty ”!
答案 3 :(得分:0)
使用类似
的声明$value = $a["'".$i."'"];
直接跟随
行$a = json_decode($a, true);