В PHP до 5.6
$day=[1, 5, 10];
$month=['январь', 'февраль', 'август'];
$year= [1920, 1956, 2005];
$result= array_map(function($d,$m,$y){return $d.' '.$m.' '.$y;}, $day, $month, $year);
var_dump($result);
В PHP5.6+
$day=[1, 5, 10];
$month=['январь', 'февраль', 'август'];
$year= [1920, 1956, 2005];
$result= array_map(function($d,$m,$y){return $d.' '.$m.' '.$y;}, ...[$day, $month, $year]);
var_dump($result);
Вместо трех форичей имеем один проход по массивам, реализованный сишным кодом в ядре PHP. Даже если количество элементов не совпадает в результирующую дату будет подставлена пустая строка.
Или ещё изящнее
$result = array_map(function(){
return sprintf('%s %s %s', ...func_get_args());
}, ...[$day, $month, $year]);
Можно ещё попытаться в array_map отдавать массивы по ссылке. Чтобы память не жрать.
...[&$day, &$month, &$year]