对于这个迭代减法过程,minuend 是数组中的每个值。
suptrahend 是前一个值(或者当没有前一个值时,数组中的第一个值)。因为第一个元素的值和它的被加数总是相等的,所以结果中的第一个值总是零。
以下所有方法都将使用输入数组:$data = array(2,4,3,12,11,1,5);
当访问第一个元素来声明初始被加数时,我使用了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() 允许通过第 3 个函数参数声明初始上数。这是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]