插件窝 干货文章 PHP二维数组日期数据分组求和:如何高效合并和计算?

PHP二维数组日期数据分组求和:如何高效合并和计算?

value date 2023 result 270    来源:    2025-03-15

在PHP中,如果你有一个二维数组,其中包含日期和对应的数值,并且你想要按日期分组并求和,可以使用数组的遍历和分组技巧来实现。以下是一个高效的解决方案:

示例数据

假设你有以下二维数组:

$data = [
    ['date' => '2023-10-01', 'value' => 100],
    ['date' => '2023-10-01', 'value' => 200],
    ['date' => '2023-10-02', 'value' => 150],
    ['date' => '2023-10-02', 'value' => 250],
    ['date' => '2023-10-03', 'value' => 300],
];

目标

将上述数据按 date 分组,并对 value 进行求和,最终得到如下结果:

$result = [
    '2023-10-01' => 300,
    '2023-10-02' => 400,
    '2023-10-03' => 300,
];

实现代码

以下是实现代码:

$data = [
    ['date' => '2023-10-01', 'value' => 100],
    ['date' => '2023-10-01', 'value' => 200],
    ['date' => '2023-10-02', 'value' => 150],
    ['date' => '2023-10-02', 'value' => 250],
    ['date' => '2023-10-03', 'value' => 300],
];

$result = [];

foreach ($data as $item) {
    $date = $item['date'];
    $value = $item['value'];

    if (isset($result[$date])) {
        $result[$date] += $value;
    } else {
        $result[$date] = $value;
    }
}

print_r($result);

代码解释

  1. 初始化结果数组$result 用于存储分组后的求和结果。
  2. 遍历原始数据:使用 foreach 遍历 $data 数组中的每个元素。
  3. 检查日期是否存在
    • 如果 $result 中已经存在该日期,则将当前 value 累加到对应的日期上。
    • 如果不存在,则将该日期作为键,并将 value 作为值存入 $result
  4. 输出结果:使用 print_r 打印分组求和后的结果。

输出结果

运行上述代码后,输出如下:

Array
(
    [2023-10-01] => 300
    [2023-10-02] => 400
    [2023-10-03] => 300
)

优化建议

  • 如果数据量非常大,可以考虑使用 array_reduce 函数来进一步优化代码。
  • 如果需要处理更复杂的日期格式或时区问题,可以使用 DateTime 类来处理日期。

使用 array_reduce 的优化版本

$result = array_reduce($data, function ($carry, $item) {
    $date = $item['date'];
    $value = $item['value'];

    if (isset($carry[$date])) {
        $carry[$date] += $value;
    } else {
        $carry[$date] = $value;
    }

    return $carry;
}, []);

print_r($result);

这种方法更加函数式,适合处理大数据集。

希望这个解决方案对你有帮助!