當前位置: 首頁> 最新文章列表> 如何在array_chunk 中使用array_reduce 聚合數據

如何在array_chunk 中使用array_reduce 聚合數據

M66 2025-04-26

在PHP 中, array_chunkarray_reduce是兩個非常強大的數組操作函數。 array_chunk可以將一個大數組分割成多個小數組,而array_reduce則可以對數組中的元素進行遞歸處理,進而對它們進行聚合。在某些情況下,我們希望將數組進行分組,並在分組後進行某種聚合操作。本文將介紹如何結合這兩個函數來實現這一目標。

1. array_chunk函數的基本用法

array_chunk是PHP 中用來將數組切分為多個小數組的函數。它將原數組按照指定的大小分成若干個子數組,返回一個二維數組。例如:

 $array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$chunks = array_chunk($array, 3);
print_r($chunks);

輸出結果為:

 Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )
    [2] => Array
        (
            [0] => 7
            [1] => 8
            [2] => 9
        )
)

這個例子中, array_chunk將原數組分割成了大小為3 的三個子數組。

2. array_reduce函數的基本用法

array_reduce函數接受一個數組和一個回調函數作為參數,對數組中的元素進行“歸約”操作。它從數組的第一個元素開始,並將當前元素與上一個元素的結果一起傳遞給回調函數,最終返回一個單一的值。例如:

 $array = [1, 2, 3, 4, 5];
$sum = array_reduce($array, function($carry, $item) {
    return $carry + $item;
});
echo $sum;  // 輸出 15

在這個例子中, array_reduce對數組中的元素進行了累加操作,最終返回了數組的總和。

3. 結合array_chunkarray_reduce來分組並聚合數據

現在我們知道了array_chunkarray_reduce的基本用法,接下來我們可以嘗試將它們結合起來,實現對數組進行分組和聚合的操作。

假設我們有一個包含用戶訂單數據的數組,我們希望按用戶ID 對訂單進行分組,並且計算每個用戶的訂單總額。我們可以先使用array_chunk按用戶ID 分組,然後利用array_reduce對每組數據進行聚合計算。

 // 假設有以下訂單數據,每個訂單包含一個 user_id 和金額 amount
$orders = [
    ['user_id' => 1, 'amount' => 100],
    ['user_id' => 2, 'amount' => 200],
    ['user_id' => 1, 'amount' => 150],
    ['user_id' => 3, 'amount' => 300],
    ['user_id' => 2, 'amount' => 50],
    ['user_id' => 1, 'amount' => 200],
];

// 使用 array_chunk 按 user_id 對訂單進行分組
$chunks = array_chunk($orders, 2);  // 假設每個分組最多有兩個訂單

// 使用 array_reduce 對每個分組的訂單金額進行聚合
$result = array_map(function($chunk) {
    return array_reduce($chunk, function($carry, $item) {
        $carry['user_id'] = $item['user_id'];
        $carry['total_amount'] += $item['amount'];
        return $carry;
    }, ['total_amount' => 0]);
}, $chunks);

// 輸出结果
print_r($result);

輸出結果:

 Array
(
    [0] => Array
        (
            [user_id] => 1
            [total_amount] => 250
        )
    [1] => Array
        (
            [user_id] => 2
            [total_amount] => 250
        )
    [2] => Array
        (
            [user_id] => 3
            [total_amount] => 300
        )
)

在這個例子中,我們首先使用array_chunk將訂單數據按每組2 個訂單進行分組。然後,我們使用array_reduce對每組訂單進行聚合,計算每個用戶的總訂單金額。

4. 完整示例

如果我們將上面的操作封裝成一個完整的函數,代碼如下:

 function groupAndAggregateOrders($orders) {
    // 按用戶 ID 分組
    $chunks = array_chunk($orders, 2);  // 假設每個分組最多有兩個訂單

    // 对每个分組计算用户的总订单金额
    return array_map(function($chunk) {
        return array_reduce($chunk, function($carry, $item) {
            $carry['user_id'] = $item['user_id'];
            $carry['total_amount'] += $item['amount'];
            return $carry;
        }, ['total_amount' => 0]);
    }, $chunks);
}

// 測試數據
$orders = [
    ['user_id' => 1, 'amount' => 100],
    ['user_id' => 2, 'amount' => 200],
    ['user_id' => 1, 'amount' => 150],
    ['user_id' => 3, 'amount' => 300],
    ['user_id' => 2, 'amount' => 50],
    ['user_id' => 1, 'amount' => 200],
];

// 調用函數
$result = groupAndAggregateOrders($orders);

// 輸出结果
print_r($result);

5. 總結

通過結合array_chunkarray_reduce ,我們可以方便地對數組進行分組並進行聚合操作。 array_chunk讓我們可以將數據拆分成多個小組,而array_reduce使得我們可以在每個小組內進行自定義的聚合計算。這兩者的結合能夠極大地提高代碼的可讀性和處理複雜數據的能力。