array_merge(...$arr)是二维转一维最简洁安全方式,但仅适用于数值索引子数组;含字符串键时会丢弃键名,需保留值可先array_map('array_values', $arr);多层嵌套须递归;sort()重置键名且默认字符串排序,数字排序需SORT_NUMERIC,混类型需预处理。

php二维数组转一维的常用方式
直接用 array_merge(...$arr) 是最简洁安全的做法,前提是二维数组的子数组都是「数值索引」且不关心键名。如果子数组含字符串键(如 ['name' => 'a']),array_merge 会丢弃键名、只保留值,这反而是多数场景想要的效果。
若需保留所有值(包括重复项)且子数组结构不统一,避免用 array_values(array_merge(...)) 套两层——array_merge 本身已重置键,再套 array_values 是冗余操作。
- 子数组含关联键但只想取值:用
array_merge(...array_map('array_values', $arr)) - 要扁平化多层嵌套(不止两层):得递归,
array_merge不适用 - 原二维数组有空子数组:
array_merge会忽略它们,无需额外过滤
sort() 对一维结果排序的注意事项
sort() 默认按字符串升序排,且会**重置键名**。如果你后续还要靠数字下标做索引访问(比如 $flat[0]),这点没问题;但若依赖原始键名(如从数据库查出带 id 键的记录),就不能用 sort(),得改用 asort() 或 ksort()。
- 数字大小排序:必须加
SORT_NUMERIC标志,否则10会排在2前面 - 中文或 UTF-8 字符串排序:
sort()不支持,得用usort($arr, 'strcoll')或Collator类 - 想降序:用
rsort(),别写sort($arr, SORT_DESC)—— 这个参数不存在,会报 Warning
一步到位:合并 + 排序的典型写法
常见需求是“扁平化后立刻按数字升序”,可链式处理,但注意 PHP 不支持方法链式调用数组函数,所以得拆成两步或封装:
立即学习“PHP免费学习笔记(深入)”;
$flat = array_merge(...$twoDim); sort($flat, SORT_NUMERIC);
如果二维数组里混着字符串和数字(比如 [1, '3', 2.5]),SORT_NUMERIC 会把字符串转为 0,导致排序错乱。此时应先统一类型:
- 全转整数:
array_map('intval', $flat) - 全转浮点:
array_map('floatval', $flat) - 过滤非数字项:
array_filter($flat, 'is_numeric')
容易被忽略的 key 冲突和类型隐式转换
二维转一维时,如果某个子数组是 [0 => 'a', 1 => 'b'],另一个是 [0 => 'x', 2 => 'y'],array_merge(...) 合并后是 [0=>'a', 1=>'b', 0=>'x', 2=>'y'] → 实际结果为 [0=>'x', 1=>'b', 2=>'y'],因为后一个 0 覆盖了前一个。这不是 bug,是 array_merge 的定义行为。
更隐蔽的是类型问题:当二维数组中存在 null、false、空字符串,在 sort() 时它们会被当作等价小值,尤其和数字混排时,false == 0 成立,可能打乱预期顺序。
真正要稳,就得在 merge 后、sort 前做显式清洗,而不是指望默认行为兜底。











