将二维数组中的行数据按一列进行分组,并对每组内的另一列进行求和

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

这感觉像是重复的,但我已经遇到了很多类似的问题,并且不能完全使解决方案适合我的问题。

我有以下数组,我想按“SECTOR”分组,然后对“MCAP”键求和。

[
    ["TICKER" => "ABC", "SECTOR" => 30, "MCAP" => 1000],
    ["TICKER" => "XYZ", "SECTOR" => 30, "MCAP" => 500],
    ["TICKER" => "ASD", "SECTOR" => 25, "MCAP" => 750]
]

我需要实现的是:

[
    30 => ['MCAP' => 1500],
    25 => ['MCAP' => 750],
]

我尝试过使用 foreach 循环,最好的方法是将所有 MCAP 值相加。我无法理解它,非常感谢您在挑战中提供帮助。

编辑:这是我尝试过的:

$sector = array();

foreach ($stocks as $row) {
    $sum += $row['MCAP'];
    $sector[$row['SECTOR']]['MCAP'] = $sum;
}

但结果是这样的:

[
    30 => ['MCAP' => 1500],
    25 => ['MCAP' => 2250]
]
php arrays sum grouping
4个回答
1
投票

尝试使用扇区值进行求和,如下所示:

$res = array();
foreach($data as $key=> $value){
  $res[$value['SECTOR']] += $value['MCAP'];
}

var_dump($res);

输出:

Warning: Undefined array key 30

Warning: Undefined array key 25
array(2) {
  [30]=>
  int(1500)
  [25]=>
  int(750)
}

1
投票

循环遍历数组,并检查结果数组中是否存在当前的

SECTOR
键。如果不是,则将其定义为零。然后将
MCAP
的当前值添加到结果数组中。

$result = array();
foreach ($array as $key=> $value) {
    if (!isset($result[$value['SECTOR']]))
        $result[$value['SECTOR']]['MCAP'] = 0;
    $result[$value['SECTOR']]['MCAP'] += $value['MCAP'];
}
print_r($result);

1
投票

您需要创建另一个空数组来保存

sum
。循环时,您可以创建每个
section
并对
mcap
的值求和:

$arraySum = array();

foreach($array as $key => $value) {
    if (!isset($arraySum[$value['SECTOR']]))
        $arraySum[$value['SECTOR']] = $value['MCAP'];
    else
        $arraySum[$value['SECTOR']] += $value['MCAP'];
}

print_r($arraySum);

0
投票

将行数据分组并求和到一个平面关联数组中是有意义的,因为

MCAP
键不会向结构添加任何值。

代码:(演示

$result = [];
foreach ($array as ['SECTOR' => $s, 'MCAP' => $m]) {
    $result[$s] = ($result[$s] ?? 0) + $m;
}
var_export($result);

如果您需要

MCAP
键,则将循环体调整为:(Demo

$result[$s]['MCAP'] = ($result[$s]['MCAP'] ?? 0) + $m;
© www.soinside.com 2019 - 2024. All rights reserved.