重组 Laravel 中的 collection 项
Restructuring collection items in Laravel
我有以下 Laravel collection 的 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
},
...
]
我需要合并总是将 collection 的两项合并为一项。因此 collection 的 10 项,在合并后,是具有以下结构的 5 项的 collection。
[
{
"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 功能,但无法真正实现我想要的。
有线索吗?
IMO,如果您只有两件物品,您应该创建一个 class,它将 "merge" 您的两件物品合二为一。
Collection是用来处理物品的集合的,所以1到N的物品不是只有2件。
可以使用laravel集合解决chunk
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);
}
Call this function to format the data
在@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 而不是处理我绝对想避免的数组。
我有以下 Laravel collection 的 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
},
...
]
我需要合并总是将 collection 的两项合并为一项。因此 collection 的 10 项,在合并后,是具有以下结构的 5 项的 collection。
[
{
"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 功能,但无法真正实现我想要的。
有线索吗?
IMO,如果您只有两件物品,您应该创建一个 class,它将 "merge" 您的两件物品合二为一。
Collection是用来处理物品的集合的,所以1到N的物品不是只有2件。
可以使用laravel集合解决chunk
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);
}
Call this function to format the data
在@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 而不是处理我绝对想避免的数组。