61

Eloquent コレクションに固有の質問ではないかもしれませんが、それらを使用しているときに気になったことがあります。$collectionのインスタンスであるオブジェクトがあると仮定しましょうIlluminate\Support\Collection

それを反復したい場合each()、クロージャーと通常の使用の長所と短所は何ですかforeach。いずれかがあります?

foreach ($collection as $item) {
    // Some code
}

$collection->each(function ($item) {
    // Some code
});
4

6 に答える 6

19

既存の回答には、紛らわしい誤解がたくさんあります。

短い答え

簡単に言えば、 Laravelコレクションを反復する場合と使用する場合に大きな違いはありません。.each()foreach どちらの手法でも同じ結果が得られます。

アイテムの改造は?

アイテムを変更するかどうかは、.each()vs . を使用するかどうかとは関係ありませんforeach。どちらも、対象のアイテムの種類に応じて、コレクション内のアイテムを変更できます (そして、できません!)。

  • コレクションにオブジェクトが含まれている場合のアイテムの変更: コレクションが一連の PHP オブジェクト (Eloquent コレクションなど) である場合は、.each()またはforeachオブジェクトのプロパティ ( など$item->name = 'foo') を変更できます。これは単純に、PHP オブジェクトが常に参照のように振る舞うためです。オブジェクト全体を別のオブジェクトに置き換えようとしている場合 (あまり一般的ではありません)、.map()代わりに を使用します。
  • コレクションに非オブジェクトが含まれている場合のアイテムの変更: これはあまり一般的ではありませんが、コレクションに文字列などの非オブジェクトが含まれている場合.each()、コレクション アイテムの値を変更する方法はありません。(クロージャーの戻り値は無視されます。).map()代わりに使用してください。

では、どちらを使用すればよいでしょうか。

パフォーマンスについて疑問がある場合のために、Eloquent アイテムと文字列のコレクションの両方の大規模なコレクションを使用していくつかのテストを行いました。どちらの場合も、 を使用しforeachた方が より高速.each()でした。しかし、私たちはマイクロ秒について話している. ほとんどの実際のシナリオでは、データベースへのアクセスなどにかかる時間と比較して、速度の違いは重要ではありません。

それは主にあなたの個人的な好みに帰着します。いくつかの操作を一緒に連鎖できるため、 を使用する.each()と便利です (たとえば、.where(...).each(...))。私は自分のコードで両方を使用する傾向がありますが、それぞれの状況で最もクリーンに見えるものに依存しています。

于 2015-06-06T19:15:23.087 に答える
4

他の2つの回答が言うこととは反対に、技術的に言えば、コレクション内のアイテムの値は変更されCollection::each()ません。を使用しますarray_map()が、その呼び出しの結果は保存しません。

コレクション内の各アイテムを変更する場合 (現在受け入れられている回答へのコメントで Damon としてオブジェクトにキャストするなど)、 を使用する必要がありますCollection::map()。これにより、基になる への呼び出しの結果に基づいて、新しい Collection が作成されarray_map()ます。

于 2015-05-27T13:43:17.890 に答える
-3

foreach() コンストラクトでは、参照によって配列を渡さない限り、繰り返し処理される配列項目の値を変更できません。

foreach ($array as &$value) $value *= $value;

each() 雄弁なメソッドは、これを可能にする PHP array_map() 関数をラップします。

前の回答の状態と同様に、他に動機がある場合は foreach() を使用する必要があります。これは、foreach() のパフォーマンスが array_map() よりもはるかに優れているためです。

http://willem.stuursma.name/2010/11/22/a-detailed-look-into-array_map-and-foreach/

于 2015-03-24T15:51:54.037 に答える