首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 二維陣列依指定鍵值分組求和完整教學

     編輯:PHP 相關知識

前言

在 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
        )
)

進階應用技巧

1. 通用分組求和函數封裝

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'])

2. 利用 array_reduce 實現函數式寫法

$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;
    }, [])
);

效能與注意事項

  • 時間複雜度:O(n),單次遍歷即可完成,適合大數據量處理
  • 記憶體優化:直接修改參考陣列,避免重複複製數據
  • 鍵值存在性檢查:建議使用 isset() 而非 array_key_exists(),效能更佳
  • 數據類型安全:實際專案中應加入 is_numeric() 檢查,防止非數值導致錯誤

常見應用場景

  • 電商訂單統計:按商品 SKU 合併銷量、金額
  • 用戶行為分析:按用戶 ID 聚合訪問次數、停留時間
  • 財務報表生成:按科目代碼匯總借貸方金額
  • 日誌分析:按錯誤代碼統計發生頻率

總結

PHP 二維陣列分組求和的核心思想是「以分組鍵為索引建立查找表」,這種模式在數據處理中極為常見。掌握此技巧能顯著提升數據聚合任務的開發效率與代碼效能。建議根據專案需求封裝為通用工具函數,並配合單元測試確保數據準確性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved