最近遇到这样一个计算需求.php
有N 个结构相同的数组.数组
例如spa
$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 个结构相同的数组.这些数组也是多维数组.code
但多维数组最终的元素都是数字.递归
如今要计算这N 个数组最终元素的平均值,并生成一个一样结构的多维数组ip
元素和这N 个数组结构相同,但元素的值为这N 个数组元素的平均值io
好比N =3 的时候function
那么生成的数组class
第一个 元素的值 应该为 (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) }
里面用到的一个技巧就是数组元素的引用.能够大大简化代码量