如何遍历stdClass类型数据?PHP反序列化数组遍历报错解决
解决stdClass对象无法按数组方式访问的问题
你遇到的错误是因为反序列化后得到的不是数组,而是stdClass对象集合,所以不能用数组下标['xxx']访问属性,得用对象属性的访问方式->xxx,或者把对象转成数组处理。
方法一:直接用对象属性访问修改代码
这是最直接高效的方式,直接将数组下标访问改为对象属性访问:
// Unserialize the order items from $wpla_order->items $wpla_order_items = maybe_unserialize( $wpla_order->items ); $order_items = []; // Loop through each order item foreach ( $wpla_order_items as $wpla_order_item ) { // Create array of order items data $order_items[] = [ 'item_id' => $wpla_order_item->OrderItemId, 'quantity' => $wpla_order_item->QuantityOrdered, ]; }
方法二:将stdClass对象转为数组
如果习惯用数组操作,可以把每个对象转成数组,两种常用方式如下:
方式1:类型强制转换
简单直接,适用于非嵌套的对象:
// Unserialize the order items from $wpla_order->items $wpla_order_items = maybe_unserialize( $wpla_order->items ); $order_items = []; // Loop through each order item foreach ( $wpla_order_items as $wpla_order_item ) { // 转成数组 $item_array = (array)$wpla_order_item; // Create array of order items data $order_items[] = [ 'item_id' => $item_array['OrderItemId'], 'quantity' => $item_array['QuantityOrdered'], ]; }
方式2:JSON序列化再反序列化
适合嵌套多层对象的场景,会把所有嵌套对象都转为数组:
// Unserialize the order items from $wpla_order->items $wpla_order_items = maybe_unserialize( $wpla_order->items ); $order_items = []; // Loop through each order item foreach ( $wpla_order_items as $wpla_order_item ) { // 转成数组 $item_array = json_decode(json_encode($wpla_order_item), true); // Create array of order items data $order_items[] = [ 'item_id' => $item_array['OrderItemId'], 'quantity' => $item_array['QuantityOrdered'], ]; }
补充说明
maybe_unserialize函数会根据序列化内容自动返回对应类型——如果原数据是序列化的对象,它就返回stdClass;如果是序列化的数组,才返回数组。你可以用var_dump($wpla_order_items)确认返回的具体类型,方便后续处理。
内容的提问来源于stack exchange,提问作者wharfdale
相关产品推荐
相关产品推荐

