This is my first post on StackOverflow.
I am looking for the best way to take two arrays that each has a different amount of data items, merge them, but summing together the items that have the same value on one of the keys (using PHP).
Input arrays:
$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', ), );
Desired output:
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', ) );
So basically just merge the two arrays into one bigger array, but sum together the ‘total_for_day’ where the ‘result_date’ matched. Please note that in the desired output it is also being ordered by the ‘result_date’ ASC.
Thanks in advance 🙂
Advertisement
Answer
I would just take the simple approach and use an intermediate array mapping:
$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);