當前位置: 首頁> 最新文章列表> 使用array_column 實現數據透視(pivot)轉換

使用array_column 實現數據透視(pivot)轉換

M66 2025-05-11

在日常開發中,我們常常需要對數據進行透視(pivot)轉換。透視表通常用來重新排列、匯總、計算或轉換數據,使其更易於分析。在PHP 中,我們可以利用內置函數array_column來實現數據的透視轉換,尤其是在處理二維數組時。

1. 理解數據透視轉換

數據透視轉換的主要目的是將數據從一個二維數組的形式重新排列,通常是將一個列的數據變為表格的列標題,而將原來的行數據轉化為列數據。這種轉換非常適合用來分析數據,尤其是當你從外部API 獲取到復雜數據時,能夠有效提升分析效率。

2. array_column函數簡介

PHP 的array_column函數允許你從多維數組中提取一個單獨的列。這個函數非常適合在數據透視操作中提取需要的列。其基本用法如下:

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

  • $column_key :需要提取的列名或列索引。

  • $index_key :可選參數,指定作為結果數組的鍵名。

3. 示例:使用array_column實現數據透視

假設我們有一個二維數組,表示一個銷售數據表格,包含了不同的銷售人員和他們的銷售額:

 $data = [
    ['salesperson' => 'Alice', 'region' => 'North', 'sales' => 1500],
    ['salesperson' => 'Bob', 'region' => 'South', 'sales' => 2000],
    ['salesperson' => 'Alice', 'region' => 'East', 'sales' => 1200],
    ['salesperson' => 'Bob', 'region' => 'West', 'sales' => 1800],
    ['salesperson' => 'Alice', 'region' => 'South', 'sales' => 2500],
];

如果我們想要將這個數據透視成按銷售人員分組的表格,並顯示他們每個地區的銷售額,我們可以使用array_column來提取相應的列,再通過合適的邏輯完成數據的重組。

4. 步驟1:提取銷售人員和銷售額

首先,我們使用array_column提取出所有銷售人員( salesperson )和他們的銷售額( sales ):

 $salespeople = array_column($data, 'salesperson');
$sales = array_column($data, 'sales');

5. 步驟2:重組數據

接下來,我們可以通過一個循環,將銷售額按銷售人員進行匯總:

 $pivotedData = [];
foreach ($data as $row) {
    $salesperson = $row['salesperson'];
    $region = $row['region'];
    $sales = $row['sales'];
    
    // 如果這個銷售人員還沒有在結果中,則初始化
    if (!isset($pivotedData[$salesperson])) {
        $pivotedData[$salesperson] = [];
    }
    
    // 將銷售額按區域添加到銷售人員的記錄中
    $pivotedData[$salesperson][$region] = $sales;
}

print_r($pivotedData);

6. 輸出結果

執行上述代碼後,你會得到一個按銷售人員和區域透視的數據:

 Array
(
    [Alice] => Array
        (
            [North] => 1500
            [East] => 1200
            [South] => 2500
        )
    [Bob] => Array
        (
            [South] => 2000
            [West] => 1800
        )
)

7. 步驟3:處理URL 替換

在一些場景下,我們可能需要處理URL。假設我們有如下的數組,其中包含了一些含有URL 的字段,我們需要將這些URL 的域名替換為m66.net

 $dataWithUrls = [
    ['name' => 'Alice', 'website' => 'http://www.example.com'],
    ['name' => 'Bob', 'website' => 'http://www.test.com'],
];

foreach ($dataWithUrls as &$row) {
    $url = parse_url($row['website']);
    $row['website'] = str_replace($url['host'], 'm66.net', $row['website']);
}

print_r($dataWithUrls);

輸出結果: