【问题标题】:Laravel Collection Group By and Sum by DateLaravel 集合按日期分组和总和
【发布时间】:2021-03-08 02:04:34
【问题描述】:

我有一组需要处理才能生成报告的数据

以下是提供的数据样本

$arrival_data = [
    [
        "arrival_date" => "09-Dec-2020",
        "total_amount" => "10",
        "total_traveller" => 6
    ],
    [
        "arrival_date" => "09-Dec-2020",
        "total_amount" => "20",
        "total_traveller" => 6
    ],
    [
        "arrival_date" => "10-Dec-2020",
        "total_amount" => "40",
        "total_traveller" => 3
    ]
];

我想处理上面的数据,以便按“arrival_date”分组并对数据求和,以便数据如下所示

$arrival_data = [
    [
        "arrival_date" => "09-Dec-2020",
        "total_amount" => "30", // sum of 10 + 20
        "total_traveller" => 6
    ],
    [
        "arrival_date" => "10-Dec-2020",
        "total_amount" => "40",
        "total_traveller" => 3
    ]
];

我还没有设法使用 laravel 集合生成预期的输出,我能够得到的最接近如下

{
    "09-Dec-2020": 30,
    "10-Dec-2020": 40
}

使用下面的代码

$collection = collect($arrival_data);

$num = $collection->groupBy('arrival_date')->map(function ($row) {
    return $row->sum('total_amount');
});

return $num->toArray();

让 laravel 集合能够编写代码以按预期生成输出,或者需要通过循环数组和处理来使用不同的方法。

谢谢

【问题讨论】:

    标签: php arrays laravel laravel-collection


    【解决方案1】:

    不要映射到总和,而是将要保留的字段映射到数组,然后对列求和并将其设置在数组中。要获取静态字段,请获取第一行,我们可以假设所有行都相等,因为它们已经分组。然后你将拥有你想要实现的相同的数组结构。

    $result = $collection->groupBy('arrival_date')
        ->map(function ($row) {
            $firstRow = $row->first();
    
            return [
                'arrival_date' => $firstRow['arrival_date'],
                'total_amount' => $row->sum('total_amount'),
                'total_traveller' => $firstRow['total_traveller'],
            ];
        })->values()
        ->all();
    

    Group by 将数组键映射到分组值,为避免这种情况并获得预期结果,只需在集合上调用 ->values()->all() 并返回值。

    【讨论】:

    • 你不应该把所有旅客总数加起来吗?
    • 谢谢@mrhn ,是的,总旅客不需要总和,
    • 对问题有帮助吗?
    • 是的,问题已经解决,输出有日期的键,有没有办法删除键所以它只得到值[]
    • @farhanz95 您可以将键重置为连续键,...->values()->all();(在all 之前调用values
    【解决方案2】:

    可能有一种更奇特的方式来处理集合,但首先想到的是一个普通的老式 foreach 循环:

    $arrival_data = [
        [
            'arrival_date' => '09-Dec-2020',
            'total_amount' => '10',
            'total_traveller' => 6
        ],
        [
            'arrival_date' => '09-Dec-2020',
            'total_amount' => '20',
            'total_traveller' => 6
        ],
        [
            'arrival_date' => '10-Dec-2020',
            'total_amount' => '40',
            'total_traveller' => 3
        ]
    ];
    
    $grouped_arrival_data = [];
    
    foreach ($arrival_data as $arrival_datum) {
        if (!isset($grouped_arrival_data[$arrival_datum['arrival_date']])) {
            $grouped_arrival_data['total_amount'] = (int) $arrival_datum['total_amount'];
            $grouped_arrival_data['total_traveller'] = $arrival_datum['total_traveller'];
            $grouped_arrival_data['arrival_date'] = $arrival_datum['arrival_date'];
        } else {
            $grouped_arrival_data['total_amount'] += (int) $arrival_datum['total_amount'];
            $grouped_arrival_data['total_traveller'] += $arrival_datum['total_traveller'];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2021-03-09
      相关资源
      最近更新 更多