Сначала я также неправильно понял вопрос.
Полагаю, что при таком представлении данных любой другой выбор будет менее понятным, чем у вас.
Если бы мы могли изменить его на что-то другое, например, если бы мы транспонировали матрицу и умножили ее наоборот, тогда было бы очень легко получить более лаконичный и, вероятно, элегантный способ.
<?php
$weights = array(0.2,0.3,0.4,0.5);
$values = array(array(1,2,0.5), array(1,1,1), array(1,1,1), array(1,1,1));
$result = array();
for($i = 0; $i < count($values[0]); ++$i) {
$result[$i] = 0;
foreach($weights as $index => $thisWeight) {
$result[$i] += $thisWeight * $values[$index][$i];
}
}
print_r($result);
$result = call_user_func_array("array_map",array_merge(array("weightedSum"),$values));
function weightedSum() {
global $weights;
$args = func_get_args();
return array_sum(array_map("weight",$weights,$args));
}
function weight($w,$a) {
return $w*$a;
}
print_r($result);
?>