【问题标题】:Laravel get most recent array item for each day in arrayLaravel 获取数组中每一天的最新数组项
【发布时间】:2021-04-22 14:16:36
【问题描述】:

我正在尝试找出最佳方式(无论我是使用查询生成器还是原始 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();

【问题讨论】:

    标签: php laravel sorting collections greatest-n-per-group


    【解决方案1】:

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

    $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();
    });
    

    【讨论】:

    • @RyanHolton 小改进我已将 [0] 更改为 -&gt;first() 以从组集合中选择第一个项目
    【解决方案2】:

    你可以使用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 2019-01-14
      • 2020-07-18
      • 2018-11-22
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多