0

我有以下 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自定义集合功能,但无法真正实现我想要的。

有什么线索吗?

4

3 回答 3

1

您可以通过使用 laravel 集合块来解决它

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

调用这个函数来格式化数据

于 2017-05-26T09:59:53.997 回答
0

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

集合是用来处理一个集合的项目,所以 1 到 N 个项目不只有两个。

于 2017-05-26T09:43:30.743 回答
0

在@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 函数而不是处理我绝对想避免的数组。

于 2017-05-26T13:22:58.280 回答