既存の回答には、紛らわしい誤解がたくさんあります。
短い答え
簡単に言えば、 Laravelコレクションを反復する場合と使用する場合に大きな違いはありません。.each()
foreach
どちらの手法でも同じ結果が得られます。
アイテムの改造は?
アイテムを変更するかどうかは、.each()
vs . を使用するかどうかとは関係ありませんforeach
。どちらも、対象のアイテムの種類に応じて、コレクション内のアイテムを変更できます (そして、できません!)。
- コレクションにオブジェクトが含まれている場合のアイテムの変更: コレクションが一連の PHP オブジェクト (Eloquent コレクションなど) である場合は、
.each()
またはforeach
オブジェクトのプロパティ ( など$item->name = 'foo'
) を変更できます。これは単純に、PHP オブジェクトが常に参照のように振る舞うためです。オブジェクト全体を別のオブジェクトに置き換えようとしている場合 (あまり一般的ではありません)、.map()
代わりに を使用します。
- コレクションに非オブジェクトが含まれている場合のアイテムの変更: これはあまり一般的ではありませんが、コレクションに文字列などの非オブジェクトが含まれている場合
.each()
、コレクション アイテムの値を変更する方法はありません。(クロージャーの戻り値は無視されます。).map()
代わりに使用してください。
では、どちらを使用すればよいでしょうか。
パフォーマンスについて疑問がある場合のために、Eloquent アイテムと文字列のコレクションの両方の大規模なコレクションを使用していくつかのテストを行いました。どちらの場合も、 を使用しforeach
た方が より高速.each()
でした。しかし、私たちはマイクロ秒について話している. ほとんどの実際のシナリオでは、データベースへのアクセスなどにかかる時間と比較して、速度の違いは重要ではありません。
それは主にあなたの個人的な好みに帰着します。いくつかの操作を一緒に連鎖できるため、 を使用する.each()
と便利です (たとえば、.where(...).each(...)
)。私は自分のコードで両方を使用する傾向がありますが、それぞれの状況で最もクリーンに見えるものに依存しています。