json_decode()之后匹配数组键的奇怪行为

时间:2010-04-04 15:12:47

标签: php arrays

我的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文件中进行测试。

它必须与从对象到数组的转换有关。

4 个答案:

答案 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);