Php Laravel获取阵列中每天的最新阵列项目

Php Laravel获取阵列中每天的最新阵列项目,php,laravel,sorting,collections,greatest-n-per-group,Php,Laravel,Sorting,Collections,Greatest N Per Group,我正试图找出最好的方法(无论是使用查询生成器还是原始PHP)来获取最新的数组项,该数组项基于它在给定日期的时间戳处创建的,在一个包含许多天的数组中 例如 [ [ "name" => "John", "created_at" => "2021-01-17 23:00:00" ], [ "name" => "Jane",

我正试图找出最好的方法(无论是使用查询生成器还是原始PHP)来获取最新的数组项,该数组项基于它在给定日期的时间戳处创建的
,在一个包含许多天的数组中

例如

[
  [
    "name" => "John",
    "created_at" => "2021-01-17 23:00:00"
  ],
  [
    "name" => "Jane",
    "created_at" => "2021-01-17 20:00:00"
  ],
  [
    "name" => "Edward",
    "created_at" => "2021-01-16 19:00:00"
  ],
  [
    "name" => "Scott",
    "created_at" => "2021-01-16 17:00:00"
  ]
]
在上面我有两天,每天都有一个条目,我想为每一天获取最新的条目,例如:

[
  [
    "name" => "John",
    "created_at" => "2021-01-17 23:00:00"
  ],
  [
    "name" => "Edward",
    "created_at" => "2021-01-16 19:00:00"
  ]
]
我目前有一个查询,可以获取两个日期之间的所有信息

$events=GoogleAnalytics::where('event\u category',$category)
->其中('event_action',$action)
->其中日期('period_from','>=',$from)

->whereDate('period_to','使用laravel collections helper,您可以为每天的第一个排序集合选择最新记录,然后按天对集合进行分组,即分组标准,然后使用map pick first result从每个组中进行分组

$collection = $collection->sortByDesc('created_at');
$results = $collection->groupBy(function ($item, $key) {
    $date=  new DateTime($item['created_at']);
    return $date->format('Y-m-d');
});
$results = $results->map(function ($item, $key) {
    return $item[0];
});
结果集看起来像

Array
(
    [2021-01-17] => Array
        (
            [name] => John
            [created_at] => 2021-01-17 23:00:00
        )

    [2021-01-16] => Array
        (
            [name] => Edward
            [created_at] => 2021-01-16 19:00:00
        )

)

或者另一个较短的版本是group、map+sort

$results = $collection->groupBy(function ($item, $key) {
    $date=  new DateTime($item['created_at']);
    return $date->format('Y-m-d');
});
$results = $results->map(function ($item, $key) {
    return $item->sortByDesc('created_at')->first();
});
你可以用

->groupBy(DB::raw('Date(created_at'))


对于按日期分组,然后使用集合

@RyanHolton次要改进,我已将
[0]
更改为
->first()
以从集合中选择第一项