Не повторять дважды. Объединяйте, когда вы выполняете итерацию за один проход во втором массиве.
Объединение двух массивов с помощью «оператора объединения» (+
) приведет к неупорядоченным ключам (не то, что обычно является проблемой с ассоциативными массивами). ). Чтобы использовать массив по умолчанию в качестве «руководства» для ключей подмассивов, вызовите array_replace()
в качестве функции слияния.
Код: ( Demo )
foreach ($array2 as &$row) {
$row += $array1;
ksort($row); // if you care
}
Или ( Демо )
foreach ($array2 as &$row) {
$row = array_replace($array1, $row);
}
Вывод:
array (
'2019-05-17' =>
array (
310 => 0,
311 => 0,
312 => 3000.0,
313 => 0,
314 => 0,
315 => 0,
),
'2019-06-20' =>
array (
310 => 0,
311 => 0,
312 => 3000.0,
313 => 0,
314 => 0,
315 => 0,
),
'2019-06-27' =>
array (
310 => 0,
311 => 0,
312 => 0,
313 => 5000.0,
314 => 0,
315 => 3000.0,
),
)
А если у вас php7.4 или выше, вы можете использовать array_map()
с синтаксисом стрелки как однострочный.
Код: ( Demo )
var_export(array_map(fn($row) => array_replace($array1, $row),$array2));
Ниже php7.4 синтаксис array_map()
значительно более многословен, Демо .
var_export(
array_map(
function($row) use ($array1) {
return array_replace($array1, $row);
},
$array2
)
);
Просто для удовольствия, вот дополнительная техника с вложенным циклом (языковые конструкции вместо вызовов функций) и объединением нулей (своего рода встроенное условное выражение).
Код: ( Демо )
$merged = [];
foreach($array2 as $date => $row) {
foreach ($array1 as $id => $value) {
$merged[$date][$id] = $row[$id] ?? $value;
}
}
var_export($merged);