在日常开发中,我们常常需要对数据进行透视(pivot)转换。透视表通常用来重新排列、汇总、计算或转换数据,使其更易于分析。在 PHP 中,我们可以利用内置函数 array_column 来实现数据的透视转换,尤其是在处理二维数组时。
数据透视转换的主要目的是将数据从一个二维数组的形式重新排列,通常是将一个列的数据变为表格的列标题,而将原来的行数据转化为列数据。这种转换非常适合用来分析数据,尤其是当你从外部 API 获取到复杂数据时,能够有效提升分析效率。
PHP 的 array_column 函数允许你从多维数组中提取一个单独的列。这个函数非常适合在数据透视操作中提取需要的列。其基本用法如下:
array_column(array $array, mixed $column_key, mixed $index_key = null): array
$array:输入的多维数组。
$column_key:需要提取的列名或列索引。
$index_key:可选参数,指定作为结果数组的键名。
假设我们有一个二维数组,表示一个销售数据表格,包含了不同的销售人员和他们的销售额:
$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 来提取相应的列,再通过合适的逻辑完成数据的重组。
首先,我们使用 array_column 提取出所有销售人员(salesperson)和他们的销售额(sales):
$salespeople = array_column($data, 'salesperson');
$sales = array_column($data, 'sales');
接下来,我们可以通过一个循环,将销售额按销售人员进行汇总:
$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);
执行上述代码后,你会得到一个按销售人员和区域透视的数据:
Array
(
[Alice] => Array
(
[North] => 1500
[East] => 1200
[South] => 2500
)
[Bob] => Array
(
[South] => 2000
[West] => 1800
)
)
在一些场景下,我们可能需要处理 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);
输出结果: