-1

我想更新一个多维 php 数组的值:$a

array(1) { 
["test"]=> array(4) { 
[0]=> int(5) 
[1]=> int(7) 
[2]=> int(10) 
[3]=> int(14) 
} 
}

对于 $a["test"][$i],我想获得这个新值 $a["test"][$i] - $a["test"][$i-1]。

在这种情况下,结果数组将是:

array(1) { 
["test"]=> array(4) { 
[0]=> int(5) 
[1]=> int(2) 
[2]=> int(3) 
[3]=> int(4) 
} 
}

当然,我可以用一个 foreach 循环和一个新数组来做到这一点

$new = array();
foreach($a as $k=>$v){
for($i=0;$i<=3;$i++){
$new[$k][$i] = $v[$i] - $v[$i-1];
}
}
$a = $new;
var_dump($a);

但这是最好的方法吗?只是出于好奇,我想知道是否使用 array_walk 让它更好,一般来说,array_walk 如何/如果可以访问数组中的上一个/下一个值。

十分感谢 !

4

2 回答 2

0

由于无论如何您最终都会用新值覆盖原始数组,因此您不妨随时更改原始数组的值。

自定义函数可以对每个子集进行连续减法。

function successive_subtraction(&$array) {
    $subtrahend = 0;               // store the previous value for subtraction
    foreach ($array as &$value) {
        $temp = $value;            // store the current value in a temporary variable
        $value -= $subtrahend;     // subtract the previous value
        $subtrahend = $temp;       // original current value become new previous value
    }
}

然后将该函数应用于外部数组的每个元素,使用array_walk.

array_walk($a, 'successive_subtraction');

这段代码实际上比你已经在做的方式更复杂。修改现有数组而不是创建修改后的副本然后覆盖它的主要优点是减少峰值内存使用量,但如果您正在处理的数组不是很大,那么这应该不是问题,我想说保持简单。

于 2017-04-10T15:43:23.683 回答
0

PHP 代码演示

<?php

$array = array(
    "test" => array(5, 7, 10, 14)
);
$new=array();
array_walk($array["test"], function($value,$key) use (&$new,&$array){
    if($key>0)
    {
        $new["test"][]=$array["test"][$key]-$array["test"][$key-1];
    }
    else
    {
        $new["test"][]=$value;
    }
});
print_r($new);

或者:

PHP 代码演示

<?php
$array = array(
    "test" => array(5, 7, 10, 14)
);
$newArray=array();
foreach($array["test"] as $key => $value)
{
    if($key>0)
    {
        $newArray["test"][]=$array["test"][$key]-$array["test"][$key-1];
    }
    else
    {
        $newArray["test"][]=$value;
    }
}
print_r($newArray);
于 2017-04-10T15:35:35.900 回答