LaravelのCollectionのfilter()に翻弄された話
環境
- Laravel 10.x本題
こんにちは、たけちゃんです。先日PHPカンファレンス2024 in 関西に行ってきました。
やはりオフラインでのイベントは良いですね。
今年は各地で色々なイベントが予定されているので時間が許す限り顔を出してみたいなと思っています。
さて、LaravelのCollectionの要素をフィルタリングする際、Illuminate\Support\Collection::filter()を使われている方は多いかと思います。
今回はfilter関数の挙動が原因で不具合を生んでしまったので共有したいと思います。
まずfilter関数の挙動についてコード例で示します。
$collection = collect(['a', 'b', 'c']);
$newCollection = $collection->filter(function ($item) {
return $item !== 'b';
});
dump($newCollection); // {[0 => 'a', 2 => 'c']}
上記の通り、フィルタリングをかけた要素がキーごと歯抜けになってしまっています。たとえばHTTP JSON APIとして実装している場合、上記の$newCollectionをフロントエンドに渡すレスポンスとして変換した際に配列の想定だった箇所がオブジェクトに変わってしまい、エラーになってしまいます。
では、どうすればいいのでしょう?
答えは簡単、以下の通りIlluminate\Support\Collection::values()を入れてあげましょう。
そうするとフィルタリングされ歯抜けになってしまったCollectionにキーを振り直してくれます。
$collection = collect(['a', 'b', 'c']);
$newCollection = $collection->filter(function ($item) {
return $item !== 'b';
})->values();
dump($newCollection);// {[0 => 'a', 1 => 'c']}
今回はLaravelのCollectionについての小ネタを紹介させて頂きました。同じような問題に遭遇された方は是非参考にしてみてください。