php 計算任意多個結構相同的多維數組的每一個元素的平均值

最近遇到這樣一個計算需求.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)
}

裏面用到的一個技巧就是數組元素的引用.能夠大大簡化代碼量

相關文章
相關標籤/搜索