
本文介绍在 php 中将多维关联数组按相同键名横向聚合为一维数组的方法,通过遍历嵌套结构并动态构建键值映射,实现类似“数组转置”的效果,适用于数据归类、统计汇总等场景。
本文介绍在 php 中将多维关联数组按相同键名横向聚合为一维数组的方法,通过遍历嵌套结构并动态构建键值映射,实现类似“数组转置”的效果,适用于数据归类、统计汇总等场景。
在实际开发中,我们常遇到需要对多个结构相似的关联子数组进行“垂直合并”的需求:即把所有子数组中具有相同键(如 '1'、'9')的值提取出来,组成一个以该键为索引、值为数值列表的新数组。这种操作本质上是将二维关联数组沿列方向“转置”,而非传统矩阵意义上的行列交换。
以下是最简洁、高效且可读性强的实现方式:
$a = [
['9' => 0, '10' => 5000],
['1' => -5000, '2' => 0],
['1' => -1600, '2' => 0],
['9' => 0, '10' => 5200],
];
$result = [];
foreach ($a as $subArray) {
foreach ($subArray as $key => $value) {
$result[$key][] = $value; // 关键:利用 [] 自动追加到数组末尾
}
}
print_r($result);输出结果:
Array
(
[9] => Array
(
[0] => 0
[1] => 0
)
[10] => Array
(
[0] => 5000
[1] => 5200
)
[1] => Array
(
[0] => -5000
[1] => -1600
)
[2] => Array
(
[0] => 0
[1] => 0
)
)✅ 核心原理说明:
$result[$key][] = $value 是 PHP 中非常实用的语法糖——当 $result[$key] 尚未定义时,PHP 会自动初始化为一个空数组;随后 [] 表示向该数组末尾追加 $value。无需预先判断键是否存在,也无需调用 isset() 或 array_key_exists(),代码更简洁、性能更优。
⚠️ 注意事项:
- 若原始子数组中存在重复键(如 ['1' => 1, '1' => 2]),PHP 会仅保留最后一个赋值(即 '1' => 2),因此请确保输入数据中每个子数组内键唯一;
- 该方法不保证最终键的顺序与首次出现顺序完全一致(尽管实践中通常保持插入序),如需严格保序,可先收集所有唯一键再循环处理;
- 若需兼容空输入(如 $a = []),当前逻辑仍安全,$result 将返回空数组。
该方案时间复杂度为 O(n×m),其中 n 为外层数组长度,m 为各子数组平均键数量,空间复杂度为 O(K),K 为所有唯一键的总数,是此类聚合任务的标准解法。

















