Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel Collection Group By和Sum By Date_Php_Arrays_Laravel_Laravel Collection - Fatal编程技术网

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;首先调用值