PHP将两个多维数组的元素求和

时间:2020-11-07 04:51:50

标签: php arrays

这是我关于StackOverflow的第一篇文章。

我正在寻找获取两个数组的最佳方法,每个数组具有不同数量的数据项,将它们合并,但是将其中一个键具有相同值的项加在一起(使用PHP)。

输入数组:

$array1 = array ( 
    0 => array ( 'result_date' => '2020-07-20', 'total_for_day' => '75', ), 
    1 => array ( 'result_date' => '2020-07-21', 'total_for_day' => '17', ), 
    2 => array ( 'result_date' => '2020-07-22', 'total_for_day' => '0', ), 
    3 => array ( 'result_date' => '2020-07-23', 'total_for_day' => '6', ), 
    4 => array ( 'result_date' => '2020-07-24', 'total_for_day' => '1', )
);
$array2 = array ( 
    0 => array ( 'result_date' => '2020-07-01', 'total_for_day' => '6264', ), 
    1 => array ( 'result_date' => '2020-07-02', 'total_for_day' => '7008', ), 
    2 => array ( 'result_date' => '2020-07-20', 'total_for_day' => '1968', ), 
    3 => array ( 'result_date' => '2020-07-21', 'total_for_day' => '7776', ), 
);

所需的输出:

array ( 
    0 => array ( 'result_date' => '2020-07-01', 'total_for_day' => '6264', ), 
    1 => array ( 'result_date' => '2020-07-02', 'total_for_day' => '7008', ), 
    2 => array ( 'result_date' => '2020-07-20', 'total_for_day' => '2043', ), 
    3 => array ( 'result_date' => '2020-07-21', 'total_for_day' => '7793', ), 
    4 => array ( 'result_date' => '2020-07-22', 'total_for_day' => '0', ), 
    5 => array ( 'result_date' => '2020-07-23', 'total_for_day' => '6', ), 
    6 => array ( 'result_date' => '2020-07-24', 'total_for_day' => '1', )
);

因此,基本上只是将两个数组合并为一个更大的数组,但是将“ result_date”匹配的“ total_for_day”加起来。请注意,在所需的输出中,它也由“ result_date” ASC进行排序。

预先感谢:-)

1 个答案:

答案 0 :(得分:0)

我只是采用简单的方法,并使用中间数组映射:

$array1 = array(...);
$array2 = array(...);
$arrayN = array(...);

$merged = array();
foreach (array_merge($array1, $array2, $arrayN) as $record) {
    $date = $record["result_date"];
    if (!isset($merged[$date])) {
        $merged[$date] = 0;
    }
    $merged[$date] += $record["total_for_day"];
}

$result = array();
foreach ($merged as $date => $days) {
    $result[] = array(
        "result_date" => $date, 
        "total_for_day" => "{$days}" // Remove the quotes if you don't want a string.
    );
}

usort($result, function ($a, $b) {
    return $a["result_date"] <=> $b["result_date"];
});

var_dump($result);