从对象转换时,无法通过数字关联键访问数组元素

时间:2017-03-23 10:47:34

标签: php arrays

将带有数字字段的对象(请参阅$obj)转换为数组时,您无法访问该元素

$obj = new stdClass();
$obj->{"325890"} = "test";

$arr = (Array) $obj;

$key = array_keys($arr)[0];

var_dump($arr); // array (size=1) '325890' => string 'test' (length=4)
var_dump($key); // string '325890' (length=6)

var_dump($arr["325890"]); // null
var_dump($arr[325890]); // null
var_dump($arr[$key]); // null

$arr = unserialize(serialize($arr)); // this fixes that

var_dump($arr["325890"]); // string 'test' (length=4);

当您将数据分配给同一元素时,也会发生奇怪的事情:

$arr = (Array) $obj;
$arr[325890] = "test"; // or $arr["325890"] = "test";

var_dump($arr);
  

数组(大小= 2)
   ' 325890' =>字符串'测试' (长度= 4)
  325890 =>字符串'测试' (长度= 4)

这是一个错误还是记录在案的行为?我使用的是PHP 7.1.2

我在尝试使用数字键访问JSON元素时发现了一个小错误。

$items = Array(
   "100" => "item",
   "200" => "item",
   "300" => "item",
   "400" => "item",
);

$json = json_encode($items);

$items = (Array) json_decode($json);

var_dump($items[100]); // null

1 个答案:

答案 0 :(得分:2)

在文档中提到“整数属性不可访问” http://php.net/manual/en/language.types.array.php

来自文档

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,有一些值得注意的例外:整数属性是不可访问的;私有变量的类名前置于变量名;受保护的变量在变量名前面加上'*'。这些前置值在任一侧都有空字节。这可能会导致一些意外行为: