最简单的方法是什么,使用较少的计算能力来检查多维数组的子键中是否有一些相等的值,如果是这样,则求和?
查看输入。是这样的:
$array[] = ['number' => 1, 'values' => ['a' => 1, 'b' => 2]];
$array[] = ['number' => 2, 'values' => ['a' => 4, 'b' => 1]];
$array[] = ['number' => 2, 'values' => ['a' => 1, 'b' => 4]]; // same "number" as the previous so get the sum between "a" of the previous and "a" of this, the same for "b"
$array[] = ['number' => 2, 'values' => ['a' => 1, 'b' => 1]]; // same "number" as the previous so get the sum between "a" of the previous and "a" of this, the same for "b"
$array[] = ['number' => 3, 'values' => ['a' => 2, 'b' => 4]];
所以输出应该是
$array[0] : ['number' => 1, 'values' => ['a' => 1, 'b' => 2]];
$array[1] : ['number' => 2, 'values' => ['a' => 6, 'b' => 6]]; //a = 4 + 1 + 1 //b = 1 + 4 + 1
$array[2] : ['number' => 3, 'values' => ['a' => 2, 'b' => 4]];
说实话,即使使用简单的 foreach,我也很难做到这一点。
我的大脑只能走这么远,不能再远了。
$array_output = [];
foreach ($array as $k => $v){
foreach ($array as $kk => $vv){
if ($v['number'] == $vv['number']) {
// ????
}
}
}
有人帮助我吗?
$array[] = ['number' => 1, 'a' => 1, 'b' => 2];
$array[] = ['number' => 2, 'a' => 4, 'b' => 1];
$array[] = ['number' => 2, 'a' => 1, 'b' => 4];
$array[] = ['number' => 2, 'a' => 1, 'b' => 1];
$array[] = ['number' => 3, 'a' => 2, 'b' => 4];
那么如何获得相同变量
number
的a
和b
变量的总和?
$seen = [];
$i = 0;
foreach ($array as $data) {
$number = $data['number'];
$a = $data['values']['a'];
$b = $data['values']['b'];
if (isset($seen[$number])) {
$output[$seen[$number]]['values']['a'] += $a;
$output[$seen[$number]]['values']['b'] += $b;
} else {
$output[] = $data;
$seen[$number] = $i;
$i++;
}
//$i++;
}
检查结果
print_r($output);
给了我这个
Array ( [0] => Array ( [number] => 1 [values] => Array ( [a] => 1 [b] => 2 ) ) [1] => Array ( [number] => 2 [values] => Array ( [a] => 6 [b] => 6 ) ) [2] => Array ( [number] => 3 [values] => Array ( [a] => 2 [b] => 4 ) ) )
编辑:回去看到了 C.H 关于错误增量放置的评论,代码现已更正。
只是补充一下,为了回答后续问题,您可以删除所有提及
['values']
的内容,以便对更简单的第二个数组示例使用相同的逻辑。
使用数组函数。这个想法是构建一个数组,其中“数字”是带有
array_reduce
的键,然后用 array_values
删除这些键。通过这种方式,您可以轻松知道是否已遇到某个数字以及是否必须求和或定义新键。
array_values
最后用于删除这些键。
$result = array_values(
array_reduce(
array: $array,
callback: function ($carry, $item) {
[$number, $values] = [$item['number'], $item['values']];
if (array_key_exists(key: $number, array: $carry)) {
foreach ($values as $key => $value) {
$carry[$number]['values'][$key] += $value;
}
}
else {
$carry[$number] = $item;
}
return $carry;
},
initial: []
)
);
print_r($result);
请注意,此代码是为 PHP >= 8.0 编写的。为了使其与旧版本兼容,请删除函数调用中的参数标签(
callback:
、key:
、array:
等)。
这样您就不需要跟踪推入结果数组的数据索引,也不需要重新索引结果,将引用变量推入结果数组来表示每个组。
假设所有行在
values
子数组中具有相同的列,只要多次遇到一个组,您就可以在嵌套循环中无条件求和。 (演示)
$result = [];
foreach ($array as $row) {
if (!isset($ref[$row['number']])) {
$ref[$row['number']] = $row;
$result[] =& $ref[$row['number']];
} else {
foreach ($row['values'] as $k => $v) {
$ref[$row['number']]['values'][$k] += $v;
}
}
}
var_export($result);
这个建议类似于我之前关于数组数据分组和求和主题的许多答案。 我的帖子标记有数组+分组+求和