
本文介绍在 php 中将多维数组按子数组的键进行转置分组的方法:遍历每个子数组,以键为索引将对应值收集到新数组中同名键下的数值列表中,最终实现“键对齐、值归并”的结构转换。
本文介绍在 php 中将多维数组按子数组的键进行转置分组的方法:遍历每个子数组,以键为索引将对应值收集到新数组中同名键下的数值列表中,最终实现“键对齐、值归并”的结构转换。
在处理报表汇总、数据聚合或 API 响应标准化等场景时,常需将“行式结构”(每个子数组代表一条记录)转换为“列式结构”(每个键代表一列,其值为该列所有记录的集合)。上述需求本质上是数组转置(array transpose)的一种变体——不依赖固定维度,而是动态依据子数组的键名进行归类。
核心思路
遍历原始二维数组 $a 的每一项(即每个关联子数组),再遍历其内部的 key => value 对;对每个 key,在目标数组 $samearray 中以该 key 为索引,使用 [] 语法追加 value,PHP 会自动创建数组并累积元素。
实现代码
$a = [
['9' => 0, '10' => 5000],
['1' => -5000, '2' => 0],
['1' => -1600, '2' => 0],
['9' => 0, '10' => 5200],
];
$samearray = [];
foreach ($a as $subArray) {
foreach ($subArray as $key => $value) {
$samearray[$key][] = $value;
}
}
print_r($samearray);
输出结果:
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
)
)
注意事项
- ✅ 键名一致性非必需:不同子数组可包含不同键(如第1行有 '9','10',第2行有 '1','2'),算法自动按实际出现的键归类;
- ⚠️ 键类型兼容性:若子数组含数字键(如 0, 1)与字符串键(如 '0', '1'),PHP 会区分对待(0 !== '0'),建议统一键类型;
- ⚠️ 顺序保留:foreach 遍历顺序与原始数组插入顺序一致,因此各键下值的排列顺序反映其在 $a 中首次出现的先后关系;
- ? 扩展建议:如需去重、求和或过滤空值,可在内层循环中添加逻辑(例如 if ($value !== null) { ... })。
此方法简洁高效,时间复杂度为 O(n)(n 为所有子数组中键值对总数),无需额外扩展或第三方库,适用于大多数 PHP 版本(>= 5.4)。










