#php #arrays
#php #массивы
Вопрос:
Это мой первый пост о 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', )
);
Таким образом, в основном просто объедините два массива в один больший массив, но суммируйте вместе ‘total_for_day’, где соответствует ‘result_date’. Пожалуйста, обратите внимание, что в желаемом выводе он также упорядочивается по ASC ‘result_date’.
Заранее спасибо 🙂
Ответ №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);
Комментарии:
1. Просто используйте
usort
для сортировки, как вам нужно. Я обновил ответ.