使用php加权算术平均值的子阵列值

时间:2014-09-30 21:57:15

标签: php multidimensional-array mean weighted-average

我有以下数组:

$array = array(
            array("A",105),
            array("B",125),
            array("C",325),
            array("D",435),
            array("A",110),
            array("A",115),
            array("C",400),
            array("D",650),
            array("E",750)
        );

并希望对它进行一些操作,如下所示:

首先:将key [0]的值分组相同,将它们提升到2次幂并求它们。为了实现这一点,我写了以下代码:

$result = array();
foreach ($array as $value){
    if (!array_key_exists($value[0], $result)){
        $result[$value[0]] = array();
    }
    $result[$value[0]][] = pow($value[1],2);
}

array_walk($result, create_function('&$v,$k', '$v = array_sum($v);'));

由此我们得到了预期的结果:

Array (
    [A] => 36350
    [B] => 15625
    [C] => 265625
    [D] => 611725
    [E] => 562500
)

第二:将这些值中的每一个除以它们的总和。换句话说(或其他数字更好: - )

Sum of them all: 36350 + 15625 + 265625 + 611725 + 562500 = 1491825

然后,分裂:

[A] 36350 / 1491825
[B] 15625 / 1491825
...
[E] 562500 / 1491825

所以最后我们有类似的东西:

Array (
    [A] 0.0243
    [B] 0.1047
    ...
    [E] 0.3770
)

我想的是这样的:

array_walk($result, create_function('&$v,$k', '$v = array_sum($v) / count($v);'));

然后我意识到这是不正确的,因为第一个值只会被A分出多少次,第二个分为B次出现等等。

所以我们会:

Array (
    [A] => 36350  / 3 = 12116.666666667
    [B] => 15625  / 1 = 15625
    [C] => 265625 / 2 = 132812.5
    [D] => 611725 / 2 = 305862.5
    [E] => 562500 / 1 = 562500
)

我正在搜索的是子阵列的分组值的一种加权算术平均值。

如果有人能帮我找到这个问题的答案,我将不胜感激。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要在循环/行走数组之前计算平方和。 要在回调函数中访问它,你可以在现代php中使用“use”(或在php5.3之前的函数内部使用“global”)

// $array = your data

$result = array(); // grouped sum of squares
foreach ( $array as list( $key, $value ) ) {
  $result[$key] += $value*value;
}

$ss = array_sum(array_values($result)); // sum of squares

// array_map preserves the keys
$means = array_map(function($value) use ($ss) {return $value/$ss;}, $result);

(我绝对没有测试过这个。我认为

之类的东西替换最后一行
array_walk($result, create_function('&$v,$k', 'global $ss; $v = $v/$ss;'));

也可能有用)