如何将具有匹配特征的PHP数组元素处理为一系列聚合?

如何将具有匹配特征的PHP数组元素处理为一系列聚合?,php,arrays,Php,Arrays,本质上,我想对PHP数组执行一种分组,然后将每个组中的元素压缩成一个聚合值 具体来说,我有一个PHP数组,其形式如下: [ [date, int], [date, int], [date, int], ... [date, int] ] 我想对其进行处理,以得到一个数组,每个数组都包含一个唯一的日期以及原始数组中与该日期相关的整数的总和,例如: [ ['2017-01-01', 1], ['2017-01-01', 1], ['2

本质上,我想对PHP数组执行一种分组,然后将每个组中的元素压缩成一个聚合值

具体来说,我有一个PHP数组,其形式如下:

[
    [date, int],
    [date, int],
    [date, int],
    ...
    [date, int]
]
我想对其进行处理,以得到一个数组,每个数组都包含一个唯一的日期以及原始数组中与该日期相关的整数的总和,例如:

[
    ['2017-01-01', 1],
    ['2017-01-01', 1],
    ['2018-01-01', 1],
    ['2019-01-01', 1],
    ['2019-01-01', -1],
    ['2020-01-01', -1],
    ['2020-01-01', 1],
    ['2020-01-01', -1]
]
应导致以下情况:

[
    ['2017-01-01', 2],
    ['2018-01-01', 1],
    ['2019-01-01', 0],
    ['2020-01-01', -1]
]
原始数组按日期顺序排列


实现这一点的有效方法是什么?

可能类似这样(假设您上面的数组数组名为
$source
):

这将创建一个数组,其中日期作为键,总和作为这些键的值。并不是你想要的。要以其他方式设置格式,请执行以下操作:

$new_destination = array();
foreach ( $destination as $key => value ) {
    $new_destination[] = array( $key, $value );
}
现在,
$new\u destination
应该是一个与所需输出匹配的数组。这可以在创建第一个数组时完成,但会变得非常混乱。因此,即使它创建了两个循环,它也避免了嵌套循环的需要,并且可能比在一个块中执行更有效


请注意,我还没有测试过它,因此它可能包含语法错误或需要稍微修改以获得所需内容,但它应该会让您走上正确的轨道。

我会这样做,假设您的输入是
$arr

foreach ($arr as list($date, $num)) {
    $result[$date] = isset($result[$date]) ? $result[$date]+$num : $num;
}
现在,
$result
将几乎满足您的要求。它实际上会生成键/值对,其中键是日期,值是数字。如果您确实喜欢嵌套数组格式,则:

foreach ($arr as list($date, $num)) {
    if (!isset($result[$date])) $result[$date] = [$date, 0]; 
    $result[$date][1] += $num;
}
这仍然将日期作为键,但它们将成对作为值。 如果希望使用顺序数组而不是日期作为键,请添加:

$result = array_values($result);

这是无效的PHP符号。那些日期是字符串吗?然后应该引用它们。这确实是无效的PHP符号,我相信你会明白的。无论如何,我会引用他们的话。这会不会导致他们OP寻找的
['2017-01-01'=>2,'2018-01-01'=>1,…]
。。编辑和固定。
if
旨在通过分配与添加来阻止PHP通知。。我的部分复制和粘贴不好,但现在应该都好了。这不会导致
['2017-01-01'=>2,'2018-01-01'=>1,…]
他们OP寻找的
['2017-01-01',2,'2018-01-01',1],…]
@Sean你说得对。我添加了一些额外的位来重新格式化它。
$result = array_values($result);