对二维数组中的行和列值求和然后相乘

问题描述 投票:0回答:3

我有一个像这样的二维数组

array(
    array(
        'column1' => 10,
        'column2' => 11
    ),
    array(
        'column1' => 25,
        'column2' => 137
    ),
    array(
        'column1' => 21,
        'column2' => 58
    )
)

按键

column1
column2
是固定的。它们不会改变。

我需要对这个二维数组中的数据执行各种函数。各种功能可以按两种方式分组:

  • 按行优先
  • 按列优先

逐行第一个函数的示例,

我想先按行对所有数字求和,然后再乘以列。

所以预期行为是 (10+11) * (25+137) * (21+58)

逐列第一个函数的示例,

我想先按列对所有数字求和,然后再乘以行。

所以预期行为是 (10+25+21)*(11+137+58)

我编写自己的组件函数没有任何问题。在上面,我只需要两个组件函数 sum 和 Product

function sum (adden1, adden2) {
    return adden1 + adden2;
}

function product (multiplicant1, multiplicant2) {
    return multiplicant1 * multiplicant2;
}

问题在于映射。我想减少需要编写的 for 循环的数量。我希望我的代码更加模块化,因为在某些情况下所需的行为如下:

  1. 对每行 100-(column1+column2)/column2 执行此操作,然后将所有结果相加。

我需要计算的公式太多了。但我非常有信心,基本上它都是先按行执行或先按列执行的混合。

希望得到一些关于值到函数映射的建议。

更新:

最终我重新设计了我的架构来解决这个问题。所以这个问题不再适用于我。

php arrays multidimensional-array sum multiplication
3个回答
1
投票

按行排列是最容易映射的:

$a = array(
    array(
        'column1' => 10,
        'column2' => 11
    ),
    array(
        'column1' => 25,
        'column2' => 137
    ),
    array(
        'column1' => 21,
        'column2' => 58
    )
);

echo array_product(array_map('array_sum', $a)), "\n";

按列需要一个实用函数来将所有列一起放入一个数组中:

echo array_product(array(
  array_sum(array_column($a, 'column1')),
  array_sum(array_column($a, 'column2'))
)), PHP_EOL;

function array_column(array $a, $column)
{
  return array_map(function($item) use ($column) {
    return $item[$column];
  }, $a);
}

1
投票

你必须以某种方式迭代数组。看一下 array_maparray_walk

这是一个例子:

<?php
$input = array(
    array(
        'column1' => 10,
        'column2' => 11
    ),
    array(
        'column1' => 25,
        'column2' => 137
    ),
    array(
        'column1' => 21,
        'column2' => 58
    )
);

echo 'Row wise : ', array_product(array_map(
    function($row){ 
     return $row['column1'] + $row['column2']; 
    }, $input)), '<br/>';

$output = array(0,0);
array_walk($input, 
  function($val, $key, &$output){ 
     $output[0] += $val['column1'];
     $output[1] += $val['column2'];
  }, &$output);
echo 'Column wise : ', array_product($output);


?>

0
投票

无论二维数组的方向如何,对

array_sum()
进行映射调用,然后对
array_product()
进行一次调用是最简洁的函数式方法。

要按行处理,请将原始数组传递给上述过程。

要按列处理,只需“转置”数组即可,换句话说,将列式数据转换为行。通常,首选方法也是最简洁的:

array_map(null, ...$array)
。然而,如果二维数组中只有一行数据,那么只会生成一个一维数组,这将破坏上述需要二维数组的过程。因此,请选择稳定的转置技术。

代码:(演示

$array = [
    ['column1' => 10, 'column2' =>  1],
    ['column1' => 3, 'column2' => 5],
    ['column1' => 2, 'column2' =>  4]
];

// multiply summed rows (10+1)×(3+5)×(2+4) = 528
echo array_product(
         array_map(
             'array_sum',
             $array
         )
     );
echo "\n---\n";
// multiply summed column (10+3+2)×(1+5+4) = 150
echo array_product(
         array_map(
             'array_sum',
             array_map(
                 fn(...$cols) => $cols,
                 ...$array
             )
         )
     );
© www.soinside.com 2019 - 2024. All rights reserved.