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

By khino