PHP - 在二维数组中映射值并对这些值执行函数

5

I have a 2 dimensional array like this

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

column1column2 是固定的,不会改变。
我需要在这个二维数组中执行各种功能。这些功能可以按以下两种方式分组:
  • 首先逐行
  • 首先逐列
一个逐行的例子,
我想要在逐列之前先逐行求和所有数字。
因此,预期的行为是 (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并将所有结果相加。
我需要处理太多的公式。但我非常自信,基本上这都是先按行或先按列执行的混合体。
希望得到一些关于将值映射到函数的建议。
更新:
最终,我重新设计了我的架构,使这个问题消失了。所以这个问题对我不再适用。

我认为不行,不能在没有for OR foreach循环的情况下完成。 - Yogesh Suthar
2个回答

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);


?>

谢谢你告诉我array_map和array_walk。我不知道这些函数的存在。 - Kim Stacks

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);
}

我喜欢你的代码比bmused的更好。但我喜欢bmused将array_map和array_walk的链接放在那里。我不知道这些函数的存在。 - Kim Stacks
@kimsia 是的,链接到手册很方便 :) 只需输入“php.net/”后跟任何函数名称即可实现相同的效果。 - Ja͢ck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接