array_merge(...$array)可展平二维数组(仅限数值键),但会覆盖重复字符串键;foreach手动赋值或array_map转stdClass更安全可控,而json_decode(json_encode())存在精度丢失、类型丢失等缺陷。

用 array_merge(...$array) 展平二维数组(仅限数值键)
如果原始二维数组的子数组都是纯数值索引(比如从数据库查出的 fetch_all(MYSQLI_ASSOC) 结果),且你只想把所有子数组的元素“堆叠”成一个一维数组,array_merge(...$array) 是最轻量的方式。
注意:它不会递归,只展平一层;且要求所有子数组键名不冲突,否则后出现的会覆盖前面的。
- 适用场景:
$data = [['name' => 'a'], ['name' => 'b']]→ 想合并为['name' => 'b'](最后一条生效) - 错误现象:若子数组含字符串键且重复,直接丢数据,无警告
- 别写
array_merge($array[0], $array[1], ...)—— 动态长度必须用展开符...
用 foreach 手动赋值到 stdClass 对象属性
所谓“二维转一维成对象属性”,本质是把二维数组中每个子数组映射为一个独立对象的属性。这不是展平,而是构造多个对象实例。常见于封装查询结果为对象列表。
例如从 MySQL 取出多行记录,每行转成一个 stdClass 实例,再存进一维数组里。
立即学习“PHP免费学习笔记(深入)”;
- 正确做法:
$objects = []; foreach ($rows as $row) { $obj = new stdClass(); foreach ($row as $key => $value) { $obj->$key = $value; } $objects[] = $obj; } - 别用
(object)$row直接强转 —— 它确实能转,但对含数字键、空键、特殊字符键的数组行为不可靠,且无法控制类型转换 - 若需深度处理(如把
created_at字符串自动转DateTime),必须手动赋值,强转做不到
用 array_map + 匿名函数批量转 stdClass
想更函数式一点?array_map 配合 (object) 强转或自定义构造逻辑,适合简洁场景。
- 安全强转(推荐用于结构干净的数据):
$objects = array_map(function($row) { return (object)$row; }, $rows); - 兼容性注意:
(object)会把数字键转成属性名0、1等,PHP 允许但访问时得用$obj->{'0'},容易出错 - 性能差异极小,但可读性上,显式
foreach更易调试和加日志
为什么不用 json_decode(json_encode($array))?
这个“技巧”网上常被误传为万能对象转换法,但它有明确缺陷:
- 会丢失
null、resource、callable和部分资源类型(如 MySQLi result) - 浮点数精度可能变化(尤其科学计数法表示的)
- 遇到非 UTF-8 字符串会返回
null(取决于json_encode设置) - 多一层序列化/反序列化,纯属多余开销,除非你本来就要走 JSON 流程
真正需要的是可控的映射逻辑,而不是绕一圈再碰运气。











