Как суммировать взвешенные массивы в PHP?

Как мне умножить значения многомерного массива на веса и суммировать результаты в новый массив в PHP или в целом?

Скучный способ выглядит так:

$weights = array(0.25, 0.4, 0.2, 0.15);
$values  = array
           ( 
             array(5,10,15), 
             array(20,25,30), 
             array(35,40,45), 
             array(50,55,60)
           );
$result  = array();

for($i = 0; $i < count($values[0]); ++$i) {
  $result[$i] = 0;
  foreach($weights as $index => $thisWeight)
    $result[$i] += $thisWeight * $values[$index][$i];
}

Есть ли более элегантное решение?

А куда делся другой ответ?

Christian Studer 24.10.2008 14:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
918
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Хм ...

foreach($values as $index => $ary )
  $result[$index] = array_sum($ary) * $weights[$index];

Думаю, вы неправильно поняли мой вопрос: я хочу получить массив взвешенных сумм, а не сумму всех сумм. Это означает, что $ result имеет размер 1xcount ($ values ​​[0]).

Christian Studer 24.10.2008 14:04

Я тоже сначала неправильно понял вопрос.

Я предполагаю, что с таким представлением данных любой другой выбор будет менее ясным, чем то, что есть у вас.

Если бы мы могли изменить его на что-то другое, например, если бы мы должны были транспонировать матрицу и умножить наоборот, тогда было бы очень легко получить более лаконичный и, вероятно, элегантный способ.

<?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);

?>
Ответ принят как подходящий

Конечно, это зависит от того, что вы подразумеваете под элегантным.

function weigh(&$vals, $key, $weights) {
    $sum = 0;
    foreach($vals as $v)
        $sum += $v*$weights[$key];
    $vals = $sum;
}

$result = $values;
array_walk($result, "weigh", $weights);

Обновлено: Извините, что не читал ваш пример лучше. Результат делаю копию значений, т.к. array_walk работает по ссылке.

Он не об этом просит.

Vinko Vrsalovic 24.10.2008 15:23

Это если убрать последний array_sum. Я сделаю это сейчас.

gnud 24.10.2008 16:01

Другие вопросы по теме