【问题标题】:Restructuring collection items in Laravel在 Laravel 中重构集合项
【发布时间】:2017-10-27 03:27:46
【问题描述】:

我有以下 800 到 4000 个项目的 Laravel 集合:

[
  {
    "date": "2017-05-26",
    "departure_time": "14:50:00",
    "arrival_time": "09:20:02",
    "departure_place_id": 16
  },
  {
    "date": "2017-05-26",
    "departure_time": "15:20:00",
    "arrival_time": "15:20:00",
    "departure_place_id": 15
  },
  ...
]

我需要合并总是将集合的两个项目合并为一个。这样10个元素的集合,合并后就是5个元素的集合,结构如下。

[
  {
     "date": "2017-05-26",
     "departure_time": "14:50:00", // from first item
     "arrival_time": "15:20:00", // from second item
     "departure_place_id": 16,  // from first item
     "arrival_place_id": 15 // from second item
  },
  ...
]

如您所见,我需要将两个连续项目的数据合并为一个。

我已经尝试了两个扩展使用 Laravel 的 custom collection 功能,但无法真正实现我想要的。

有什么线索吗?

【问题讨论】:

  • 如果没有其他方法没有帮助,那么您可以通过转换为数组、进行操作以及将结果数组转换为集合来实现。但我希望有人会在没有这个“数组”步骤的情况下发布解决方案。
  • 完全正确@Autista_z .. 我也在寻找不使用数组的解决方案。希望有一个。

标签: php laravel collections laravel-collection


【解决方案1】:

可以通过laravel collectionchunk解决

 public function formatCollection($collection)
 {
  $results = [];
     foreach (collect($collection)->chunk(2) as $chunk)
     {
         $results[] = [
             'date' => $chunk[0]['date'],
             'departure_time' => $chunk[0]['departure_time'],
             'arrival_time' => $chunk[1]['arrival_time'],
             'departure_place_id'=> $chunk[0]['departure_place_id'],
             'arrival_place_id' => $chunk[1]['departure_place_id']
         ];
     }

    return collect($results);
 }

调用该函数格式化数据

【讨论】:

  • 我想避免使用数组。知道如何仅使用集合并返回没有数组的集合吗?
  • 可以返回json,return response()->json($results);
  • 你也可以阅读文档,它只会返回数组,你可以通过上面的转换再次返回你的json
  • 我已经改变了我的答案,请检查现在返回的收藏,如果对你有帮助,请检查并投票:)
【解决方案2】:

IMO,如果你只有两个项目,你应该创建一个类,像你一样将你的两个项目“合并”成一个。

Collection 用于处理项目的集合,因此 1 到 N 个项目不仅仅是两个。

【讨论】:

  • 该集合有 800 到 4000 个项目。这只是我帖子中的一个例子。
  • 哦,好吧!因此,对于这种用法(我处理了一个类似的案例:为车队管理公司总结道路事件)。我在集合对象周围创建了一个装饰器(en.wikipedia.org/wiki/Decorator_pattern)来操作它
  • 是的,可能是……考虑。我将研究一下装饰器——我宁愿寻找一种在创建集合时重组项目的解决方案,以避免再次接触集合。
【解决方案3】:

根据@Vikash 的使用chunk() 的提示和一些研究,我想出了以下最适合我需要的解决方案:

public function convert() : \Illuminate\Support\Collection 
{
    /** @var \Illuminate\Database\Eloquent\Collection $collection */
    $collection = $this->cruise->where('line_id', $lineId)->get();

    return $collection->chunk(2)->map(function ($chunk) {
                /** @var Collection $chunk */
                return [
                    'date' => $chunk->first()->date,
                    'downriver' => $chunk->last()->departure_place_id < $this->departure_place_id,
                    'departure_time' => $chunk->first()->departure_time,
                    'arrival_time' => $chunk->last()->departure_time,
                    'departure_place_id' => $chunk->first()->departure_place_id,
                    'arrival_place_id' => $chunk->last()->departure_place_id,
                ];
            });
}

我将它放入存储库中,这是一种解耦逻辑的好方法。它使用 collection functions 而不是处理我绝对想避免的数组。

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多