phpでは配列のデータをループするならforeachを使います。LaravelのCollectionでもforeachを使ってループできます。しかし、Collectionならeach()
を使いましょう。
foreachからeachへ
まず、tinkerでCollectionのデータを作成します。
>>> use Illuminate\Support\Collection; >>> $c = Collection::times(5); => Illuminate\Support\Collection {#3500 all: [ 1, 2, 3, 4, 5, ], }
foreachを使ってループします。
>>> foreach($c as $item) { echo $item." "; } 1 2 3 4 5
これと同じことが、Collectionのメソッドのeach()
で可能です。
>>> $c->each(function($item) { echo $item." "; }) 1 2 3 4 5
continue, break
foreachでは、ループの途中である条件でスキップ(continue)、あるいはループから抜け出す(break)ことができます。each()
でも同様なことができますが、ちょっと違うやり方です。
continueの代わりに、return true(あるいは returnだけ)とします。
>>> foreach($c as $item) { if ($item > 2) continue; echo $item." "; } 1 2 >>> $c->each(function($item) { if ($item > 2) return true; echo $item." "; }) 1 2
breakの代わりに、return falseとします。
>>> foreach($c as $item) { if ($item > 2) break; echo $item." "; } 1 2 >>> $c->each(function($item) { if ($item > 2) return false; echo $item." "; }) 1 2
変数のスコープ
foreachでは以下のようなことは簡単です。
>>> $sum = 0 >>> foreach($c as $item) { $sum += $item; } >>> echo $sum 15
しかし、eachでは、
>>> $sum = 0 >>> $c->each(function($item) { $sum += $item; }) <warning>PHP Notice: Undefined variable: sum in Psy Shell code on line 2</warning> <warning>PHP Notice: Undefined variable: sum in Psy Shell code on line 2</warning> <warning>PHP Notice: Undefined variable: sum in Psy Shell code on line 2</warning> <warning>PHP Notice: Undefined variable: sum in Psy Shell code on line 2</warning> <warning>PHP Notice: Undefined variable: sum in Psy Shell code on line 2</warning> >>> echo $sum 0
foreachではOkなのに、each()
のループの中では、$sum
は未定義となりループの外では値が初期値のままです。警告もでていますね。
これを正しく行うには、each()
のコールバックの関数に$sum
の変数をポインターで渡す必要あります。この手のuse()
の使用はよくあります。
>>> $c->each(function($item) use(&$sum) { $sum += $item; }) >>> echo $sum; 15
まあ、この例ではそんなことしなくても、sum()
を使えば、
>>> $c->sum() 15
で済みますけれど。
しかし、each()
を使えば、こんなことも可能です。
>>> $sum = $c->each(function($item) { echo $item." "; })->sum() 1 2 3 4 5 >>> echo $sum 15
これは、each()
がCollectionを返すので、それをsum()
にチェーンできるからです。