【问题标题】:PHP sum elements of two multi dimensional arraysPHP对两个多维数组的元素求和
【发布时间】:2020-11-07 14:17:19
【问题描述】:

这是我在 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 排序。

提前致谢:-)

【问题讨论】:

    标签: php arrays


    【解决方案1】:

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

    $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);
    

    【讨论】:

    • 只需使用usort 对其进行排序即可。我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多