Array (
[0] => Array ( [0] => 4 [1] => 3 [2] => 5 [3] => 7 [4] => 210 )
[1] => Array ( [0] => 4 [1] => 9 [2] => 5 [3] => 7 [4] => 210 )
[2] => Array ( [0] => 4 [1] => 9 [2] => 25 [3] => 7 [4] => 210 ) )
我想用其前面元素的值的乘积替换每个数组的最后一个条目。例如,
Array ( [0] => 4 [1] => 3 [2] => 5 [3] => 7 [4] => 210 )
实际上会是:
Array ( [0] => 4 [1] => 3 [2] => 5 [3] => 7 [4] => 420 )
如何删除最后一个元素并将前面的元素相乘并填写正确的值作为最后一个元素?
我尝试阅读有关
array_splice()
的内容,但不理解他们使用的整数,例如; array_splice($input, 1, -1);
一个紧凑的解决方案:array_walk()处理主数组的每一行,可调用接收子数组作为引用,删除最后一个元素,使用array_reduce()计算所有剩余元素的乘积并将其分配为子数组的最后一个元素。
<?php
$mainArray = [
[4, 3, 5, 7, 210],
[4, 9, 5, 7, 210],
[4, 9, 25, 7, 210],
];
array_walk ($mainArray, function (&$subArr) {
array_pop($subArr);
$subArr[] = !$subArr ? 0 : array_reduce($subArr, fn ($carry, $item) => $carry * $item, 1);
},
);
print_r ($mainArray);
结果:
Array
(
[0] => Array
(
[0] => 4
[1] => 3
[2] => 5
[3] => 7
[4] => 420
)
[1] => Array
(
[0] => 4
[1] => 9
[2] => 5
[3] => 7
[4] => 1260
)
[2] => Array
(
[0] => 4
[1] => 9
[2] => 25
[3] => 7
[4] => 6300
)
)
迭代行时,隔离除最后一个元素之外的所有元素并将它们相乘。用该乘积覆盖最后一个元素。 (演示)
var_export(
array_map(
function($row) {
$row[array_key_last($row)] = array_product(array_slice($row, 0, -1));
return $row;
},
$array
)
);
或者将所有内容相乘,然后除以弹出的元素:(Demo)
var_export(
array_map(
function($row) {
$row[] = array_product($row) / array_pop($row);
return $row;
},
$array
)
);
或者在相乘之前删除最后一个元素(Demo)
var_export(
array_map(
function($row) {
array_pop($row);
$row[] = array_product($row);
return $row;
},
$array
)
);
或者通过将乘积与修改后的行合并来享受箭头函数语法:(演示)
var_export(
array_map(
fn($row) => $row + [array_key_last($row) => array_product($row) / array_pop($row)],
$array
)
);
或者使用经典循环进行引用修改:(Demo)
foreach ($array as &$row) {
array_pop($row);
$row[] = array_product($row);
}
var_export($array);