最近遇到这样一个计算需求.
有N 个结构相同的数组.
例如
$x = array(
0=>array(1,'ab'=>array(1,2),'x'=>5),
1=>array(2,'ab'=>array(3,4),'x'=>1),
2=>array(3,'ab'=>array(3,4),'x'=>2),
...
N=>array(10,'ab'=>array(5,6),'x'=>10)
);
数组 x 中包含了 N 个结构相同的数组.这些数组也是多维数组.
但多维数组最终的元素都是数字.
现在要计算这N 个数组最终元素的平均值,并生成一个同样结构的多维数组
元素和这N 个数组结构相同,但元素的值为这N 个数组元素的平均值
比如N =3 的时候
那么生成的数组
第一个 元素的值 应该为 (1+2+3+10)/4 = 4
其他元素以此类推
最终应得到这样一个数组
array(4,'ab'=>array(3,4),'x'=>4.5)
实现原理不复杂,就是数组递归遍历,递归到最后一层时
把N个数组的元素值相加再除以N 即得到最终数组的元素值.
那么直接上代码
$x = array(
0=>array(1,'ab'=>array(1,2),'x'=>5),
1=>array(2,'ab'=>array(3,4),'x'=>1),
2=>array(3,'ab'=>array(3,4),'x'=>2),
3=>array(10,'ab'=>array(5,6),'x'=>10)
);
$c = array();
average_multip_array($x,$c,count($x));
function average_multip_array($arr1,&$arr2,$i){
foreach($arr1[0] as $k=>$v){
if(!is_array($v)){
for($n=0;$n<$i;$n++){
$arr2[$k]+=$arr1[$n][$k];
}
$arr2[$k]=$arr2[$k]/$i;
}else{
for($n=0;$n<$i;$n++){
$tmp[$n] = &$arr1[$n][$k];
}
average_multip_array($tmp,$arr2[$k],$i);
}
}
}
var_dump($c);
输出
array(3) {
[0]=>
int(4)
["ab"]=>
array(2) {
[0]=>
int(3)
[1]=>
int(4)
}
["x"]=>
float(4.5)
}
里面用到的一个技巧就是数组元素的引用.可以大大简化代码量