PHP中stdClass与数组互转有两大核心方法:(array)强制转换最快但仅支持公有属性且不递归;json_encode()+json_decode(true)可深度处理嵌套但会丢失资源、Closure等不可序列化内容,并可能改变键名类型。

PHP 中 stdClass 和数组互转很常见,核心是用 (array) 强制转换和 json_encode() + json_decode() 组合,但要注意深层嵌套、对象类型、键名合法性等细节。
stdClass 转数组(简单直转)
直接强制类型转换即可,适用于纯属性、无方法、无私有/保护成员的 stdClass 对象:
-
$arr = (array) $obj;—— 最快,但只转换**公共属性**,且若属性名含非法变量名字符(如数字开头、含空格),会变成\0*\0key形式(PHP 7.2+ 改为"\0*\0key"字符串键) - 若需兼容特殊键名或深层递归转换,推荐用 JSON 中转:
$arr = json_decode(json_encode($obj), true); - 注意:JSON 方式会丢失资源、Closure、不可序列化对象,且所有数字字符串键会被转成整型(如
"123"→123),时间戳类对象也会变成字符串
数组转 stdClass(简单直转)
同样可用强制转换,但仅限一维关联数组;多维或含数字键时需递归处理:
-
$obj = (object) $arr;—— 将关联数组转为stdClass实例,数字索引键会被忽略(PHP 8.0+ 会报 Warning) - 安全通用做法仍是 JSON 中转:
$obj = json_decode(json_encode($arr)); - 若数组含非 UTF-8 字符(如 GBK),需先
mb_convert_encoding($arr, 'UTF-8', 'auto')再 JSON 编码,否则json_encode()返回 false
处理嵌套结构与特殊类型
原生强制转换不递归,遇到子数组或子对象会保留原类型。需要深度转换时,建议封装函数:
- 递归转数组(支持子对象、子数组):
function objectToArray($obj) { return is_object($obj) ? array_map(__FUNCTION__, (array)$obj) : (is_array($obj) ? array_map(__FUNCTION__, $obj) : $obj); } - 递归转对象(保持结构):
function arrayToObject($arr) { return is_array($arr) ? (object) array_map(__FUNCTION__, $arr) : $arr; } - 这两个函数不依赖 JSON,适合处理含资源、资源句柄等不能 JSON 化的数据(但无法转方法或私有属性)
注意事项和避坑点
实际开发中容易忽略这些细节:
-
stdClass属性访问用->,数组用[],混用会报错(如$obj['name']或$arr->name) - JSON 方式转换后,原始
null、true、false仍保持,但0、""、[]等“空值”不会被过滤 - 如果对象来自
json_decode($json, false)(默认),它本身就是stdClass;设为true才得数组 - Laravel 的
collect()或 Symfony 的ArrayObject提供更健壮的结构操作,但底层仍基于上述原理
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











