【问题标题】:How do I sum up weighted arrays in PHP?如何总结 PHP 中的加权数组?
【发布时间】:2010-09-18 23:26:06
【问题描述】:

如何将多维数组的值与权重相乘并将结果相加到 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];
}

有没有更优雅的解决方案?

【问题讨论】:

  • 咦,其他答案去哪儿了?

标签: php arrays interpolation


【解决方案1】:

当然,这取决于你所说的优雅。

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 通过引用工作。

【讨论】:

  • 这不是他要的。
  • 如果你删除了最后一个array_sum。我现在就这样做。
【解决方案2】:

嗯……

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

【讨论】:

  • 我想你误解了我的问题:我想得到一个加权和的数组,而不是所有和的总和。这意味着 $result 的维度是 1xcount($values[0])。
【解决方案3】:

一开始我也误解了这个问题。

我猜如果使用该数据表示,任何其他选择都不会像您所拥有的那样清晰。

如果我们可以将其更改为其他内容,例如,如果我们要转置矩阵并以相反的方式相乘,那么很容易获得更简洁且可能更优雅的方式。

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

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多