将带有数字字段的对象(请参阅$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
答案 0 :(得分:2)
在文档中提到“整数属性不可访问” http://php.net/manual/en/language.types.array.php
来自文档
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,有一些值得注意的例外:整数属性是不可访问的;私有变量的类名前置于变量名;受保护的变量在变量名前面加上'*'。这些前置值在任一侧都有空字节。这可能会导致一些意外行为: