我有以下数组:
$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
)
我正在搜索的是子阵列的分组值的一种加权算术平均值。
如果有人能帮我找到这个问题的答案,我将不胜感激。
非常感谢提前。
答案 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;'));
也可能有用)