使用array_walk(PHP)更新多维数组中与另一个值相关的值
我想更新多维php数组的值:$a使用array_walk(PHP)更新多维数组中与另一个值相关的值,php,arrays,array-walk,Php,Arrays,Array Walk,我想更新多维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]=>
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);
$new=array();
foreach($a为$k=>$v){
对于($i=0;$i
既然您最终还是要用新值覆盖原始数组,那么您最好在执行时更改原始数组的值
自定义函数可以对每个子集执行连续减法
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\u walk
将该函数应用于外部数组的每个元素
array_walk($a, 'successive_subtraction');
这段代码实际上比您已经在做的更复杂。修改现有数组而不是创建修改后的副本然后覆盖它的主要优点是峰值内存使用量更少,但是如果您正在处理的数组不是很大,那么这应该不是一个真正的问题,我想说的是保持它不变imple.当使用array\u walk
时,您可以使用类似于函数($a)的闭包使用(&$carray){}
来沿着上一个方向执行所需的数据,并且您确实想要$i=1
。非常感谢!这真的很有趣。
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($a, 'successive_subtraction');