2016-04-10 31 views
-1

我已经测试了很多来自其他问题的答案,但我的问题的解决方案仍然难以捉摸。任何援助将不胜感激。基于另一个键的匹配值的PHP数组平均值

我有这样的阵列:

array (
    0 => 
    array (
    0 => '1', 
    1 => '34', 
), 
    1 => 
    array (
    0 => '8', 
    1 => '51', 
), 
    2 => 
    array (
    0 => '1', 
    1 => '72', 
), 
    3 => 
    array (
    0 => '8', 
    1 => '38', 
), 
    4 => 
    array (
    0 => '1', 
    1 => '80', 
), 
    5 => 
    array (
    0 => '3', 
    1 => '56', 
), 
) 

我要平均的第二个键的[1],其中所述第一密钥[0]的值是相匹配的值。这将是所需的结果:

array (
    0 => '62',  // the average of '34, 72, 80' 
    1 => '44.5',  // the average of '51, 38' 
    2 => '56',  // the average of '56' 
) 

谢谢。

回答

0

使用array_reduce()

$result = array_reduce 
(
    $array, 
    function($carry, $item) 
    { 
     if(! isset($carry[$item[0]])) $carry[$item[0]] = [ 'values'=>[$item[1]], 'avg'=>$item[1] ]; 
     else 
     { 
      $carry[$item[0]]['values'][] = $item[1]; 
      $carry[$item[0]]['avg']  = array_sum($carry[$item[0]]['values'])/count($carry[$item[0]]['values']); 
     } 
     return $carry; 
    }, 
    array() 
); 

print_r($result); 

结果:

Array 
(
    [1] => Array 
     (
      [values] => Array 
       (
        [0] => 34 
        [1] => 72 
        [2] => 80 
       ) 
      [avg] => 62 
     ) 
    [8] => Array 
     (
      [values] => Array 
       (
        [0] => 51 
        [1] => 38 
       ) 

      [avg] => 44.5 
     ) 
    [3] => Array 
     (
      [values] => Array 
       (
        [0] => 56 
       ) 
      [avg] => 56 
     ) 
) 

eval.in demo

如果你不感兴趣的保存键:

$result = array_values($result); 

如果你只想要平均值:

$result = array_column($result, 'avg'); 

随着array_reduce我们重新排列逐渐增加值,以各自的索引键,计算相对平均。

你可以得到相同的结果与foreach循环:

$result = array(); 
foreach($array as $key => $val) 
{ 
    if(! isset($result[$item[0]])) $result[$item[0]] = [ 'values'=>[$item[1]], 'avg'=>$item[1] ]; 
    else 
    { 
     $result[$item[0]]['values'][] = $item[1]; 
     $result[$item[0]]['avg']  = array_sum($result[$item[0]]['values'])/count($result[$item[0]]['values']); 
    } 
} 
+0

问题解决了! @ fusion3k,谢谢你的慷慨解答。我学到了东西。 – Pickle

+0

不客气 – fusion3k

相关问题