按一列对多维数组数据进行分组,并对每组中的子数组内的列求和

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

最简单的方法是什么,使用较少的计算能力来检查多维数组的子键中是否有一些相等的值,如果是这样,则求和?

查看输入。是这样的:

$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
变量的总和?

php arrays multidimensional-array sum grouping
3个回答
1
投票
$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']
的内容,以便对更简单的第二个数组示例使用相同的逻辑。


0
投票

使用数组函数。这个想法是构建一个数组,其中“数字”是带有

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:
等)。


0
投票

这样您就不需要跟踪推入结果数组的数据索引,也不需要重新索引结果,将引用变量推入结果数组来表示每个组。

假设所有行在

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

这个建议类似于我之前关于数组数据分组和求和主题的许多答案。 我的帖子标记有数组+分组+求和

© www.soinside.com 2019 - 2024. All rights reserved.