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()にチェーンできるからです。
