0

我有以下数组:

$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
)

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

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

提前谢谢了。

4

1 回答 1

0

如果我理解正确,您需要在循环/遍历数组之前计算平方和。要在回调函数中访问它,您可以在现代 php 中使用“使用”(或在 php5.3 之前的函数中使用“全局”)

// $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;'));

也可能有效)

于 2014-09-30T22:34:45.810 回答