我有一个像这样的二维数组
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 循环的数量。我希望我的代码更加模块化,因为在某些情况下所需的行为如下:
我需要计算的公式太多了。但我非常有信心,基本上它都是先按行执行或先按列执行的混合。
希望得到一些关于值到函数映射的建议。
更新:
最终我重新设计了我的架构来解决这个问题。所以这个问题不再适用于我。
按行排列是最容易映射的:
$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);
}
你必须以某种方式迭代数组。看一下 array_map 和 array_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_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
)
)
);