插件窝 干货文章 如何高效合并并分组汇总PHP二维数组中的日期和数值?

如何高效合并并分组汇总PHP二维数组中的日期和数值?

value date 数组 result 532    来源:    2025-03-13

在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,
];

实现步骤

  1. 初始化一个空数组 用于存储分组汇总后的结果。
  2. 遍历原始数组,检查每个元素的 date 字段是否已经存在于结果数组中。
    • 如果存在,则将 value 累加到对应的日期上。
    • 如果不存在,则在结果数组中创建一个新的键值对,键为 date,值为 value
  3. 返回结果数组

代码实现

function groupAndSumByDate($data) {
    $result = [];

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

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

    return $result;
}

$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 = groupAndSumByDate($data);

print_r($result);

输出结果

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

解释

  • isset($result[$date]) 用于检查当前日期是否已经在结果数组中存在。
  • 如果存在,则将当前 value 累加到已有的值上。
  • 如果不存在,则创建一个新的键值对。

优化

如果你需要处理的数据量非常大,可以考虑使用 array_reduce 函数来进一步优化代码:

function groupAndSumByDate($data) {
    return array_reduce($data, function($result, $item) {
        $date = $item['date'];
        $value = $item['value'];
        $result[$date] = ($result[$date] ?? 0) + $value;
        return $result;
    }, []);
}

这种方法使用了 array_reduce 函数,代码更加简洁,且在处理大数据量时性能更好。

总结

通过上述方法,你可以高效地合并并分组汇总PHP二维数组中的日期和数值。根据数据量的大小,你可以选择使用简单的 foreach 循环或更高效的 array_reduce 函数来实现。