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

コレクションの2つのアイテムを常に1つにマージする必要があります。そのため、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
  },
  ...
]

ご覧のとおり、連続する 2 つのアイテムのデータを 1 つにマージする必要があります。

私はすでにLaravelsのカスタムコレクション機能を2回拡張して使用しようとしましたが、本当に欲しいものを達成できません。

どんな手掛かり?

4

3 に答える 3

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 に答える