在Laravel重组收集物品

时间:2017-05-26 09:29:21

标签: php laravel collections laravel-collection

我有以下Laravel集合,包含800到4000个项目:

[
  {
    "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
  },
  ...
]

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

我已经尝试了两个延伸使用Laravels custom collection功能,但无法实现我想要的功能。

有任何线索吗?

3 个答案:

答案 0 :(得分:1)

您可以使用laravel collection chunk

解决此问题
list1[0]=" ab"
  

调用此函数格式化数据

答案 1 :(得分:0)

IMO,如果你只有两个项目,你应该创建一个类,它将合并"你和你的两件物品一样。

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

答案 2 :(得分: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 functions而不是处理我绝对想要避免的数组。