というのでちょっとハマったのでメモ。

下記のコードを見てください。array_firstというのはLaravelのヘルパで、初めに該当した要素を返すというものです。

1
2
3
4
5
$result = array_first([3,4,5,6], function($a, $b){
\Log::debug("A is :" . $a . " B is :" . $b);
return $v === 4;
});
\Log::debug("RESULT: " . $result);

どうなると思いますか。
下記のようになると思いませんか?

1
2
3
A is :0 B is :3
A is :1 B is :4
RESULT: 4

そうです。こうなります。Laravel4.x系では。

5.x系


では、同一のコードを5.x系で実行した場合はどうなるでしょうか…???

1
2
3
4
5
A is :3 B is :0
A is :4 B is :1
A is :5 B is :2
A is :6 B is :3
RESULT:

上記のようになります。

「え!ふぇ~~~~~???」という感じですよね。私は「ふぇ~~~~~~???」と思いました。しかし、残念ながらこれは正しい動作なのです。ドキュメントを見てみましょう。

なんということでしょう!!KeyとValueの引数の順序が逆転しています。これはヘルパだけでなくコレクションもです。「ふぇ~~~~~~???」ですね。私は「ふぇ~~~~~~???」と思いました。

なぜこうなったのか


これらのヘルパは引数一つでも動作します。つまり、5.x系では第一引数に値をとることでキーを引数に指定しなくても値だけで処理できるようになっています。おそらく、値だけで処理できるようするためにこうなったんでしょう。個人的な予想なのでたぶんとしか言えませんが…。

個人的には「順序的にはKey, Valueだろ、常識的に考えて。」という感がぬぐえないですが…。