当前位置: 首页> 最新文章列表> 使用 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);

输出结果: