将二维数组每行中的最后一个值替换为该行中除最后一个值之外的所有值的乘积

问题描述 投票:0回答:2
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);

php arrays multidimensional-array subset multiplication
2个回答
0
投票

一个紧凑的解决方案: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
        )
)

0
投票

迭代行时,隔离除最后一个元素之外的所有元素并将它们相乘。用该乘积覆盖最后一个元素。 (演示)

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);
© www.soinside.com 2019 - 2024. All rights reserved.