PHP数组转对象后访问属性报非对象错误的原因咨询
问题分析与解决方案
嘿,我来帮你搞定这个问题~你遇到的报错其实是因为对数组转对象的逻辑理解有点小偏差,我给你拆解清楚:
当你用(object) $cars把外层的索引数组转成对象时,只有外层数组被转换成了stdClass对象,内部的每个子数组并没有被自动转成对象。转完之后的$cars对象,它的属性是0、1、2这类数字键,每个属性对应的值还是原来的关联数组。所以当你foreach ($cars as $car)时,$car其实还是个数组,不是对象,自然不能用->make来访问属性,这就是报错的根源。
具体解决方法
方法一:把每个子数组都转成对象(推荐)
如果你希望每个$car都能通过->访问属性,应该给外层数组的每个子数组单独做对象转换,用array_map就能批量处理:
<?php $cars = array( array( 'make' => 'Audi', 'model' => 'A4', 'year' => '2014', ), array( 'make' => 'Benz', 'model' => 'c300', 'year' => '2015', ), array( 'make' => 'BMW', 'model' => 'i8', 'year' => '2016', ), ); // 给每个子数组做对象转换,外层保持数组(遍历更直观) $cars = array_map(function($item) { return (object) $item; }, $cars); foreach ($cars as $car) { print $car->make . "<br>"; // 现在可以正常访问属性啦 }
这样处理后,$cars里的每个元素都是stdClass对象,$car->make就能正确获取值。
方法二:如果非要保留外层对象,遍历的时候转换每个元素
要是你坚持要把外层数组转成对象,那在遍历的时候得把每个$car也转成对象:
<?php $cars = array( array( 'make' => 'Audi', 'model' => 'A4', 'year' => '2014', ), array( 'make' => 'Benz', 'model' => 'c300', 'year' => '2015', ), array( 'make' => 'BMW', 'model' => 'i8', 'year' => '2016', ), ); $cars = (object) $cars; foreach ($cars as $car) { $carObj = (object) $car; print $carObj->make . "<br>"; }
不过这种方式有点冗余,一般更推荐第一种方法,因为外层用数组存储多个元素本身就更符合逻辑。
方法三:直接用数组访问(不转对象)
如果只是为了获取值,其实也可以跳过转对象的步骤,直接用数组键访问:
foreach ($cars as $car) { print $car['make'] . "<br>"; }
但这就违背了你想用对象属性访问的初衷,所以还是看你的实际需求来选。
内容的提问来源于stack exchange,提问作者OhDavey
相关产品推荐
相关产品推荐

