按两个值对多维数组数据进行分组,并对每组内的另一个值求和

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

我有一个多维数组。我需要用相同的“司机”和“日期”键来总结距离值

Input : 

$firstArr = array(
0 =>array('driver'=>'xxxx',
                    'distance' => 100,
                    'vehicle' => 1,
                    'date' => '2019-10'),

1=>array('driver'=>'xxxx',
                    'distance' => 200,
                    'vehicle' => 2,
                    'date' => '2019-10'),
2=>array('driver'=>'yyyy',
                    'distance' => 100,
                    'vehicle' => 3,
                    'date' => '2019-10'));

预期输出:

$finalArr = array(
0 =>array('driver'=>'xxxx',
                    'distance' => 300,
                    'vehicle' => '1,2',
                    'date' => '2019-10'),

1=>array('driver'=>'yyyy',
                    'distance' => 100,
                    'vehicle' => 3,
                    'date' => '2019-10'));

我尝试了下面的代码。但输出是一个日期数组。

$subArr = array();
foreach($firstArr as $key => $val){
$subArr[$val['driver']][$val['date']]['distance'] += $val['distance'];
$subArr[$val['driver']][$val['date']]['vehicle'] .= $val['vehicle'].',';
$subArr[$val['driver']][$val['date']]['date'] = $val['date'];
$subArr[$val['driver']][$val['date']]['driver'] = $val['driver'];

}
$result = array_values($subArr); 
php arrays multidimensional-array sum grouping
2个回答
2
投票

您可以使用

dirver
date
作为按键,演示

$result = [];
foreach($array as $v){
    $key = $v["driver"] . "_" . $v["date"];
    if(isset($result[$key])){
        $result[$key]["distance"] += $v["distance"];
    }else{
        $result[$key] = $v;
    }
}
$result = array_values($result);

0
投票

您还可以使用array_reduce按驾驶员和日期汇总距离和车辆。 在array_combine的帮助下,我们可以为每个驱动程序日期组合设置初始数组(如果不存在),然后对所需字段进行处理。

$keys = array_keys($input[0]);
$result = array_reduce($input, function ($sum, $row) use ($keys) {
    $key = $row['driver'] . $row['date'];
    $sum[$key] = $sum[$key] ?? array_combine($keys, [$row['driver'], null, null, $row['date']]);
    $sum[$key]['distance'] += $row['distance'];
    $sum[$key]['vehicle'] .= (($sum[$key]['vehicle']) ? ',': '' ) . $row['vehicle'];
    return $sum;
}, []);

结果:

Array
(
    [xxxx2019-10] => Array
        (
            [driver] => xxxx
            [distance] => 300
            [vehicle] => 1,2
            [date] => 2019-10
        )

    [yyyy2019-10] => Array
        (
            [driver] => yyyy
            [distance] => 100
            [vehicle] => 3
            [date] => 2019-10
        )

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