最干净的方法是array_merge(...$arr),它将二维数组摊平合并为一维,要求每个子元素均为数组;implode+explode会丢失类型、键名并因分隔符冲突出错。

直接用 array_merge(...$arr) 最干净
二维数组转一维,本质是把每个子数组“摊平”合并。PHP 原生的 array_merge 配合展开运算符(...)就能一步到位,不需要先 implode 再 explode ——那会丢数据类型、破坏非字符串值,还可能因分隔符冲突出错。
常见错误是写成 array_merge($arr)(没展开),结果还是原样返回二维结构;或者手动循环 + array_merge,效率低且冗余。
- 必须写成
array_merge(...$arr),...是关键 - 要求
$arr的每个元素都是数组,否则会警告或报错 - 键名会被重置为数字索引(如需保留键可改用
array_reduce++合并)
implode 不适合二维转一维,它只处理字符串
标题里提到的 “implode 法” 是个典型误解。implode 的作用是把一维数组拼成字符串,输入必须是字符串或能自动转字符串的值;它无法识别嵌套结构,也不能反转回数组——除非你再用 explode,但这就引入了严重缺陷:
- 子数组里有逗号、空格等分隔符时,
explode会错误切分 - 数字、布尔、
null、对象等非字符串值被强制转字符串后不可逆 - 关联键名完全丢失
比如 [[1, true], ['a', null]] 经 implode(', ', $arr) 得到 "Array, Array",已经不可用了。
立即学习“PHP免费学习笔记(深入)”;
需要保留键名或处理不规则结构?用 array_reduce
当子数组键名重要,或某些元素不是数组(比如混着字符串或 null),array_merge(...$arr) 会失败。这时 array_reduce 更可控:
$flat = array_reduce($arr, function ($carry, $item) {
return is_array($item) ? array_merge($carry, $item) : $carry;
}, []);
- 可以加
is_array($item)判断,跳过非法项 -
$carry初始值设为空数组,避免未定义警告 - 如果想保留原始键(如
[0 => [a => 1], 1 => [b => 2]]→[a => 1, b => 2]),把array_merge换成$carry + $item
性能差异其实不大,但语义和健壮性差很远
在几千元素量级下,array_merge(...$arr) 和手写循环耗时差距不到 1ms。真正影响开发体验的是可读性和容错能力:
-
array_merge(...$arr)一行表达意图,别人一眼看懂 - 用
implode+explode看似“巧”,实则埋了数据截断、类型丢失、调试困难三颗雷 - PHP 5.6+ 支持展开运算符,无需降级兼容
真遇到超大二维数组(比如 10 万+ 子数组),优先考虑是否该在数据源头做扁平化,而不是硬拼 PHP 函数——内存和栈深度才是瓶颈。











