2014-09-30 5 views
0

У меня есть следующий массив:Weighted среднее арифметическое значений подмассив с использованием PHP

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

и хотел бы сделать некоторые операции с ним так же, как следующие:

Первое: группы значений клавишу [ 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);')); 

, но потом я понял, что это не правильно, потому что первое значение будет разделено только, сколько раз происходит, второй по вхождений Б и т.д.

Таким образом, мы имели бы:

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

Если вы правильно поняли, вам нужно будет вычислить сумму квадратов перед циклом/ходом по массиву. Для доступа к нему внутри функции обратного вызова можно использовать «использовать» в современной 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;')); 

может также работать)