【问题标题】:PHP Array of Array Element's differencesPHP Array of Array Element 的区别
【发布时间】:2017-05-04 13:54:51
【问题描述】:

我有一个 PHP 数组,其中包含以下格式的数字:

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

有没有一种简单的方法来获得第二个数组,将这些元素的差异显示为 T-1(第一个设置为 0)?

新数组如下所示:

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

【问题讨论】:

  • 你试过什么??
  • 您可以使用array_walk 通过回调进行迭代,并将原始数组作为“userdata”第三个参数传递,以便您进行计算。试一试,看看你想出了什么。

标签: php arrays math iteration subtraction


【解决方案1】:

对于这个迭代减法过程,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]

【讨论】:

  • 谢谢。 foreach() 版本效果很好。 array_walk() 版本似乎可以工作,但原始数组的第一个值保持不变,而不是设置为 0。
  • @r1pster 自从您接受后,我已经完善了我的答案。请查看方法选项并为您的项目选择您喜欢的方法选项。我推荐array_walk()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 2017-10-16
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多