PHP中的PHP平均值基于另一个键的匹配值

时间:2016-04-10 15:26:21

标签: php arrays

我已经从其他问题中测试了很多答案,但我的问题的解决方案仍然是难以捉摸的。非常感谢任何帮助。

我有这个数组:

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

谢谢。

1 个答案:

答案 0 :(得分: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'] );
    }
}