Laravel 获取数组中每一天的最新数组项

Laravel get most recent array item for each day in array

我正在尝试找出最佳方法(无论是使用查询生成器还是原始 PHP 来执行此操作)以根据它的 created_at 时间戳获取最新的数组项给定一天,在包含许多天的数组中。

例如...

[
  [
    "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_category', $category)
                        ->where('event_action', $action)
                        ->whereDate('period_from', '>=', $from)
                        ->whereDate('period_to', '<=', $to)
                        ->orderBy('created_at', 'desc')
                        ->get();

使用laravel collections helper,您可以选择每天的最新记录,首先对集合进行排序,然后按天对您的集合进行分组,即分组标准,然后使用地图从每个组中选择第一个结果

$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
        )

)

DEMO

或者另一个更短的版本是 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)'))

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