我已经从其他问题中测试了很多答案,但我的问题的解决方案仍然是难以捉摸的。非常感谢任何帮助。
我有这个数组:
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 :(得分:0)
$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'] );
}
}