最常用且稳妥的转换方式有两种:(array)强制转换仅处理顶层public属性,速度快;json_decode(json_encode())可深度递归转换,结构干净但不支持DateTime等特殊类型。

直接把 stdClass 对象转成数组,最常用也最稳妥的方式就两种:用 (array) 强制转换 和 用 json_decode(json_encode()) 组合。前者快但只处理顶层、只认 public 属性;后者能穿透嵌套、结构干净,适合数据库查询结果这类标准数据。
(array) 转换适用于单个 stdClass 实例
它简单直接,对 new stdClass() 创建的对象完全有效,且不依赖 JSON 编码。
-
$obj = new stdClass(); $obj->name = "Tom"; $obj->score = 95; -
$arr = (array) $obj; - 此时
$arr['name']和$arr['score']可正常访问
⚠️ 注意:这只对单个 stdClass 有效。如果你拿到的是“对象数组”(比如 fetch_all(PDO::FETCH_OBJ) 返回的 array<stdclass></stdclass>),直接对整个数组做 (array)$result 是无效的——它不会递归转换每个元素,后续 $result[0]['name'] 仍会报错。
json_encode + json_decode 是安全通用解法
这个组合本质是“序列化再反序列化”,能把整个对象或对象数组深度转为纯关联数组。
-
$arr = json_decode(json_encode($obj), true); - 若
$obj是单个stdClass,结果是普通一维数组 - 若
$obj是[$obj1, $obj2]这样的对象数组,结果是二维关联数组,可直接$arr[0]['name']访问
✅ 优势明显:自动处理嵌套对象、忽略不可序列化内容(如资源)、输出结构统一、兼容所有标准数据库字段(字符串、数字、null、布尔、数组)。
❌ 缺点:不能处理 DateTime 对象、闭包、资源句柄等;中文需确保 UTF-8 环境,否则可能变 null。
手动遍历 + get_object_vars 更轻量可控
当你明确知道数据来自数据库、全是 stdClass,又想避开 JSON 开销或担心编码问题,可以用循环配合 get_object_vars:
-
$arr = []; -
foreach ($objArray as $item) { $arr[] = get_object_vars($item); } -
get_object_vars()对stdClass完全友好,返回的就是键值对数组,无前缀、无干扰
这个方式不依赖 JSON,性能略优,且结果和 (array) 转换单个对象一致,适合批量处理查询结果。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











