我试图从这个数组中打印出数字200,但我不知道如何使用(对象)强制转换。
$x= [(object)["items"=>[1=>100,2=>200]]];
答案 0 :(得分:-2)
你不应该盲目地将数组转换为对象,因为它不安全。 PHP在手册中明确警告不要这样做。
数组转换为具有按键和相应值命名的属性的对象,但除非迭代,否则将无法访问数字键。
这意味着投射到对象的数组中的任何数字键都将变得不可访问。在这种特殊情况下,正在转换的数组中唯一的键恰好是一个字符串,这意味着$x->items[2]
将给出预期的结果。
因此,例如,$x = (object) [1=>100,2=>200]
将导致$x[2]
和$x["2"]
始终为空,尽管var_dump($x)
显示为否则。这对于不经意的观察者来说可能是非常特殊的。
因此,如果您想要安全地将数组转换为对象,则可以使用此方法。
function recursiveArrayToObject(Array $arr, stdClass $obj = null) {
if (!$obj) {
$obj = new stdClass;
}
foreach($arr as $key => $value) {
if (is_array($value)) {
$obj->$key = recursiveArrayToObject($value);
} else {
$obj->$key = $value;
}
}
return $obj;
}
$x = ["items"=>[1=>100,2=>200]];
$xObj = recursiveArrayToObject($x);
var_dump($xObj);
这会给你......
object(stdClass)#1 (1) { ["items"]=> object(stdClass)#2 (2) { ["1"]=> int(100) ["2"]=> int(200) } }
所以现在$xObj->items->{"2"}
会按预期给你200
。
如果你想要安全,非递归的版本......
function arrayToObject(Array $arr, stdClass $obj = null) {
if (!$obj) {
$obj = new stdClass;
}
foreach($arr as $key => $value) {
$obj->$key = $value;
}
return $obj;
}
$x = ["items"=>[1=>100,2=>200]];
$xObj = arrayToObject($x);
var_dump($xObj, $xObj->items[2]);
...输出
object(stdClass)#1 (1) { ["items"]=> array(2) { [1]=> int(100) [2]=> int(200) } } int(200)