5

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

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

column1column2是固定的。它们不会改变。

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

  • 逐行优先
  • 列优先

Row-wise first 函数的示例,

在乘以列之前,我想先按行汇总所有数字。

所以预期的行为是 (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 执行此操作,然后总结所有结果。

我需要处理的公式太多。但我非常有信心,基本上这都是先行先行或先行先行的混合。

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

更新:

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

4

2 回答 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);


?>
于 2013-02-05T05:54:22.307 回答
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";

Column wise 需要一个实用函数来将所有列一起抓取到一个数组中:

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);
}
于 2013-02-05T06:55:00.647 回答