Php Laravel Collection Group By和Sum By Date
我收集了一些数据,需要对这些数据进行处理才能生成报告 以下是提供的数据样本Php Laravel Collection Group By和Sum By Date,php,arrays,laravel,laravel-collection,Php,Arrays,Laravel,Laravel Collection,我收集了一些数据,需要对这些数据进行处理才能生成报告 以下是提供的数据样本 $arrival_data = [ [ "arrival_date" => "09-Dec-2020", "total_amount" => "10", "total_traveller" => 6 ], [ &quo
$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_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 collection生成预期的输出,我能得到的最接近的结果如下所示
{
"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();
do laravel collection能够编写代码以产生预期的输出,或者需要通过循环数组和处理使用不同的方法
谢谢将要保留的字段映射到一个数组,对列求和,然后在数组中设置它,而不是映射到总和。要获取静态字段,请获取第一行,我们可以假定所有行都相等,因为它们已经分组。然后您将拥有与您想要实现的相同的数组结构
$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将数组键映射到分组值,为了避免这种情况并收到预期的结果,只需调用集合上的->值->全部,它就会返回值。与其映射到总和,不如将要保留的字段映射到数组并对列求和,然后在数组中设置它。要获取静态字段,请获取第一行,我们可以假定所有行都相等,因为它们已经分组。然后您将拥有与您想要实现的相同的数组结构
$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将数组键映射到分组值,为了避免这种情况并收到预期的结果,只需调用集合上的->值->全部,它就会返回值。对于集合,可能有一种更奇特的方法来实现这一点,但首先想到的是一个简单的旧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'];
}
}
可能有一种更为奇特的方法来处理集合,但首先想到的是一个简单的旧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'];
}
}
您不应该也对总旅行者进行求和吗?谢谢@mrhn,是的,总旅行者不需要求和,这有助于解决问题吗?是的,问题已经解决,输出有日期的键,是否有方法删除键,使其只得到值[]@farhanz95您可以将键重置为连续键,->值->全部;先调用值,然后再调用值。您不应该对总旅行者进行求和吗?谢谢@mrhn,是的,总旅行者不需要求和,这有助于解决问题吗?是的,问题已经解决,输出有日期的键,是否有方法删除键,使其只得到值[]@farhanz95您可以将键重置为连续键,…->values->all;首先调用值