最近遇到這樣一個計算需求.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) }
裏面用到的一個技巧就是數組元素的引用.能夠大大簡化代碼量