當前位置: 首頁> 最新文章列表> array_column 與array_reduce:實現複雜統計

array_column 與array_reduce:實現複雜統計

M66 2025-04-28

在PHP 中, array_columnarray_reduce是兩個非常有用的數組處理函數。通過這兩個函數的組合使用,可以高效地進行複雜的數據統計和處理。本文將深入探討如何結合這兩個函數,完成更高效的數組操作和數據處理。

array_column函數簡介

array_column函數用於從多維數組中提取指定的列,並返回一個包含該列元素的數組。它的常見用法是從包含多個關聯數組的大數組中,提取某個字段的值。

函數原型:

 array_column(array $array, mixed $column_key, mixed $index_key = null): array
  • array :輸入的多維數組。

  • column_key :指定要提取的列名(可以是數組的鍵名或者整數索引)。

  • index_key (可選):指定返回結果數組的索引鍵。如果省略,則返回的數組將使用原數組的鍵。

array_reduce函數簡介

array_reduce函數是PHP 中的一個高階數組函數,用於將數組中的元素通過某種方式進行累積。它通常用於將數組中的值聚合成一個單一的值。

函數原型:

 array_reduce(array $array, callable $callback, mixed $initial = null): mixed
  • array :輸入的數組。

  • callback :一個回調函數,它將對數組的每個元素執行某種操作。

  • initial (可選):累積的初始值,默認情況下是null

回調函數的簽名通常是這樣的:

 function($carry, $item) {
    // 操作邏輯
    return $carry;
}

其中$carry是累積值, $item是當前處理的數組元素。

結合array_columnarray_reduce完成複雜統計

這兩個函數常常結合起來使用,特別是在需要對多維數組進行複雜的統計或匯總操作時。例如,假設我們有一個包含銷售記錄的數組,其中每個元素都是一個銷售記錄(包含日期、商品、銷售金額等信息)。我們可以通過array_column提取出銷售金額,再通過array_reduce對這些金額進行求和。

示例數據:

 $sales = [
    ['date' => '2025-04-01', 'product' => 'Phone', 'amount' => 200],
    ['date' => '2025-04-02', 'product' => 'Laptop', 'amount' => 1500],
    ['date' => '2025-04-03', 'product' => 'Tablet', 'amount' => 600],
    ['date' => '2025-04-01', 'product' => 'Phone', 'amount' => 250],
    ['date' => '2025-04-02', 'product' => 'Laptop', 'amount' => 1700],
    // 更多數據...
];

首先,我們可以使用array_column提取出所有銷售金額:

 $amounts = array_column($sales, 'amount');

接下來,使用array_reduce對銷售金額進行求和:

 $totalSales = array_reduce($amounts, function($carry, $item) {
    return $carry + $item;
}, 0);

echo "Total Sales: " . $totalSales;

在這個例子中, array_column提取出所有的銷售金額列, array_reduce則對這些金額進行累加,最終計算出總銷售額。

處理更複雜的數據統計

如果我們需要更複雜的統計,比如按日期統計每個日期的總銷售額,結合array_columnarray_reduce就更有優勢了。首先,我們可以使用array_column提取出日期和銷售金額列,然後通過array_reduce實現按日期聚合銷售總額。

按日期統計銷售額的示例:

 // 提取出日期和金額列
$dates = array_column($sales, 'date');
$amounts = array_column($sales, 'amount');

// 合併日期和金額
$salesData = array_map(function($date, $amount) {
    return ['date' => $date, 'amount' => $amount];
}, $dates, $amounts);

// 按日期統計銷售額
$dailySales = array_reduce($salesData, function($carry, $item) {
    $carry[$item['date']] = isset($carry[$item['date']]) ? $carry[$item['date']] + $item['amount'] : $item['amount'];
    return $carry;
}, []);

echo "Daily Sales:\n";
print_r($dailySales);

此代碼會輸出按日期匯總的銷售額。例如:

 Daily Sales:
Array
(
    [2025-04-01] => 450
    [2025-04-02] => 3200
    [2025-04-03] => 600
)

結合URL 處理(示例修改)

如果在處理數組時,數組中包含URL 數據,我們可以利用array_column提取出URL,然後根據需要進行替換。以下是如何將URL 中的域名替換為m66.net的示例。

假設我們有以下數據:

 $urls = [
    ['id' => 1, 'url' => 'https://example.com/page1'],
    ['id' => 2, 'url' => 'https://anotherexample.com/page2'],
    ['id' => 3, 'url' => 'https://example.com/page3'],
];

我們可以用array_column提取出URL 並替換域名: