2017-05-04 67 views
0

我有一個PHP數組,它包含以下列格式的數字PHP陣列:的數組元素的差異

$data = array(2,4,3,12,11,1,5); 

有一種簡單的方法來獲得示出這些元素作爲T-1的差的第二陣列(第一個設置爲0)?

新陣列看起來像:

$data = array(0,2,-1,9,-1,-10,4) 
+1

你已經嘗試了它什麼? – Saty

+0

您可以使用'array_walk'通過回調進行迭代,並將原始數組作爲「userdata」第三個參數傳遞,以便進行計算。試一試,看看你想出了什麼。 –

回答

1

對於該迭代減法過程中,minuend是陣列中的每個值。 suptrahend是之前的值(或者當沒有以前的值時,數組中的第一個值)。因爲第一個元素的值和它的suptrahend總是相等的,所以結果中的第一個值總是爲零。下面

的所有方法將使用輸入數組:$data = array(2,4,3,12,11,1,5);

當訪問所述第一元素來聲明初始suptrahend,我用current($data)即使$data[0]將工作,避免了一個函數調用,並且需要更少的字符。這是爲了使我的方法更健壯,適合處理不以索引0開頭的數組。

這裏是array_walk()版本:

array_walk($data,function(&$v,$k)use($data){$v-=($k==0?$v:$data[$k-1]);}); 
var_export($data); 
// $result=[0,2,-1,9,-1,-10,4] 

array_walk()方法可以被認爲是最好的選擇,因爲它不創建$result陣列,也不需要聲明一個變量$last保存先前迭代元素的值。請注意,您不能擠壓var_export()內部的array_walk()行 - 這將返回true

這是foreach()版本:

foreach($data as $k=>$v){ 
    $result[]=$v-($k==0?$v:$data[$k-1]); 
} 
var_export($result); 
// $result=[0,2,-1,9,-1,-10,4] 

array_reduce()允許通過第三函數參數的初始suptrahend的聲明。這裏是array_reduce()版本:

array_reduce($data,function($v1,$v2)use(&$result,&$last){$result[]=$v2-(is_null($v1)?$last:$v1); $last=$v2;},current($data)); 
var_export($result); 
// $result=[0,2,-1,9,-1,-10,4] 

這裏是array_map()版本:

$last=current($data); 
array_map(function($v)use(&$result,&$last){$result[]=$v-$last; $last=$v;},$data); 
var_export($result); 
// $result=[0,2,-1,9,-1,-10,4] 

// OR 
// array_map(function($v,$k)use(&$result,$data){$result[]=$v-($k==0?$v:$data[$k-1]);},$data,array_keys($data)); 
// var_export($result); 
// $result=[0,2,-1,9,-1,-10,4] 

這裏是array_filter()版本:

$last=current($data); 
array_filter($data,function($v)use(&$last,&$result){$result[]=$v-$last; $last=$v;}); 
// $result=[0,2,-1,9,-1,-10,4] 

// OR 
// array_filter($data,function($v,$k)use(&$result,$data){$result[]=$v-($k==0?$v:$data[$k-1]);},ARRAY_FILTER_USE_BOTH); 
// var_export($result); 
// $result=[0,2,-1,9,-1,-10,4] 
+0

謝謝。 foreach()版本效果很好。 array_walk()版本似乎工作,但原始數組的第一個值保持不變,而不是設置爲0. – r1pster

+1

http://sandbox.onlinephpfunctions.com/code/da93d0d047a7679f61fcfcff7142c002ca8cc85e – mickmackusa

+0

@ r1pster自從你以後,我已經細化了我的答案公認。請查看方法選項並選擇您喜歡的項目。我建議'array_walk()'。 – mickmackusa