在 PHP 開發中,經常遇到需要對二維陣列進行分組統計的需求。例如:根據某個欄位(如商品名稱、用戶 ID)將相同鍵值的記錄合併,並對數值欄位進行求和運算。本文將詳細介紹如何高效實現這一功能,並提供完整可執行的代碼範例。
假設我們有一個包含多筆記錄的二維陣列,結構如下:
$data = [
['a' => 'aa', 'a1' => 1, 'a2' => 1],
['a' => 'bb', 'a1' => 2, 'a2' => 2],
['a' => 'cc', 'a1' => 3, 'a2' => 3],
['a' => 'aa', 'a1' => 1, 'a2' => 1],
['a' => 'bb', 'a1' => 5, 'a2' => 5],
];
目標是將 a 鍵值相同的記錄合併,並對 a1、a2 進行求和,預期結果:
$result = [
['a' => 'aa', 'a1' => 2, 'a2' => 2],
['a' => 'bb', 'a1' => 7, 'a2' => 7],
['a' => 'cc', 'a1' => 3, 'a2' => 3],
];
使用 foreach 遍歷陣列,以分組鍵值(此處為 a)作為結果陣列的索引,實現 O(n) 時間複雜度的高效處理:
$data = [
['a' => 'aa', 'a1' => 1, 'a2' => 1],
['a' => 'bb', 'a1' => 2, 'a2' => 2],
['a' => 'cc', 'a1' => 3, 'a2' => 3],
['a' => 'aa', 'a1' => 1, 'a2' => 1],
['a' => 'bb', 'a1' => 5, 'a2' => 5],
];
$result = [];
foreach ($data as $row) {
$key = $row['a'];
if (!isset($result[$key])) {
// 首次遇到該分組,直接儲存整行資料
$result[$key] = $row;
} else {
// 已存在該分組,累加數值欄位
$result[$key]['a1'] += $row['a1'];
$result[$key]['a2'] += $row['a2'];
}
}
// 重置數字索引,輸出整潔陣列
$result = array_values($result);
print_r($result);
Array
(
[0] => Array
(
[a] => aa
[a1] => 2
[a2] => 2
)
[1] => Array
(
[a] => bb
[a1] => 7
[a2] => 7
)
[2] => Array
(
[a] => cc
[a1] => 3
[a2] => 3
)
)
function groupSum(array $data, string $groupKey, array $sumKeys): array {
$result = [];
foreach ($data as $row) {
$key = $row[$groupKey] ?? null;
if ($key === null) continue;
if (!isset($result[$key])) {
$result[$key] = $row;
} else {
foreach ($sumKeys as $sumKey) {
if (isset($row[$sumKey], $result[$key][$sumKey])) {
$result[$key][$sumKey] += $row[$sumKey];
}
}
}
}
return array_values($result);
}
// 使用範例
$summed = groupSum($data, 'a', ['a1', 'a2'])
$result = array_values(
array_reduce($data, function ($carry, $row) {
$key = $row['a'];
if (!isset($carry[$key])) {
$carry[$key] = $row;
} else {
$carry[$key]['a1'] += $row['a1'];
$carry[$key]['a2'] += $row['a2'];
}
return $carry;
}, [])
);
isset() 而非 array_key_exists(),效能更佳is_numeric() 檢查,防止非數值導致錯誤PHP 二維陣列分組求和的核心思想是「以分組鍵為索引建立查找表」,這種模式在數據處理中極為常見。掌握此技巧能顯著提升數據聚合任務的開發效率與代碼效能。建議根據專案需求封裝為通用工具函數,並配合單元測試確保數據準確性。