こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在5社経験している、13年目エンジニアです。
この記事では、 LaravelでCollectionインスタンスから条件を満たす要素を抽出できるCollection::filterメソッドについて
- Collection::filterメソッドとは
- Collection::filterメソッドを使ったサンプルプログラム
と、丁寧に解説していきます。
前提条件:実行環境について
実行環境は以下の通りです。
OS | Windows11 |
---|---|
PHPのバージョン | 8.2.4 |
Laravelのバージョン | 10.45.1 |
この記事では
C:\Laravel
配下に【LaravelSample】という名前でプロジェクトを作成しています。
Collection::filterメソッドとは
Collection::filterメソッドとは、呼び出しているCollectionインスタンスを指定した関数でフィルタリングして条件を満たす要素のみのCollectionインスタンスを返すメソッドです。
Collectionクラスのメソッドを使うためには
1 |
use Illuminate\Support\Collection; |
を宣言する必要があります。
使い方サンプルは下記になります。
1 2 3 4 |
$sample = collect([1, 2, 3, 4]); $result = $sample->filter(function($item){ return $item % 2 == 0; }); |
上記の例だと、フィルタリングしているのは、以下の箇所です。
1 2 3 |
function($item){ return $item % 2 == 0; } |
偶数のもののみ抽出しています。
resultには以下の内容のCollectionインスタンスが返されます。
1 2 3 4 5 6 7 8 9 10 11 |
object(Illuminate\Support\Collection)#292 (2) { ["items":protected]=> array(2) { [1]=> int(2) [3]=> int(4) } ["escapeWhenCastingToString":protected]=> bool(false) } |
注意して頂きたいのが、インデックスの情報は保持されている、という点です。
ちなみに、もし抽出する条件を指定していなかった場合
- false(bool型)
- 空文字
- 0(ゼロ)
というような、falseと判定されるものが取り除かれたCollectionインスタンスが返されます。
では、次の章で実際に使ってみます。
Collection::filterメソッドを解説するプログラムの概要
Collection::filterメソッドを解説するプログラムは、
- コントローラー
- Bladeビュー
- web.php
3つを使います。
コントローラーは名前を【SampleController】とし、
LaravelSample\app\Http\Controllers\SampleController.php
に位置しています。
Collection::filterメソッドを使って、Collectionインスタンスをフィルタリングし、Bladeビューで表示させ中身を確認します。
表示するCollectionインスタンスは指定する条件を
- 指定した場合
- 指定しなかった場合
の2パターン用意します。
コントローラーからBladeビューに値を渡して表示する方法は以下の記事をご参考ください。
Bladeビューは名前を【sample.blade.php】とし、viewsディレクトリ直下に格納します。
web.phpには、【http://〇〇.〇〇.〇〇:8000/sample】でアクセスした場合、SampleControllerのCollection::collectメソッドを確認するメソッドを呼ぶように定義します。
ちなみにweb.phpとは、ルーティングを定義することができるファイルです。
詳しくはこちらの記事をご参考ください。
コントローラー:SampleController.phpのサンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Http\Controllers; use Illuminate\Support\Collection; class SampleController extends Controller { /** * Collection::filterメソッドサンプル */ public function collection_sample(){ $fruit_collection = collect(['apple', 'grapes', 'tangerines', 'kiwi', 'pineapple']); $filter_fruit_collection = $fruit_collection->filter(function($fruit){ return mb_strlen($fruit) > 5; }); $no_condition_collection = collect(['aaa', 0, 'bbb', false, 'ccc', '', 'ddd']); $filter_no_condition_collection = $no_condition_collection->filter(); return view('sample', compact('fruit_collection', 'filter_fruit_collection', 'no_condition_collection', 'filter_no_condition_collection')); } } |
mb_strlen関数とは、文字数を取得することができる関数です。
詳しくはこちらの記事をご参考ください。
Bladeビュー:sample.blade.phpのサンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charaset="utf-8"> <title>Collection::filterメソッドサンプル</title> </head> <body> <h2>抽出条件を指定した場合</h2> <h3>fruit_collectionを表示</h3> <pre>{{ var_dump($fruit_collection) }}</pre> <h3>Collection::filterメソッドで5文字より長いものだけ取得</h3> <pre>{{ var_dump($filter_fruit_collection) }}</pre> <h2>抽出条件を指定しない場合</h2> <h3>no_condition_collectionを表示</h3> <pre>{{ var_dump($no_condition_collection) }}</pre> <h3>Collection::filterメソッドでfalseになるものだけ取得</h3> <pre>{{ var_dump($filter_no_condition_collection) }}</pre> </body> </html> |
web.phpのサンプルプログラム
1 2 3 4 5 6 |
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\SampleController; Route::get('/sample', [SampleController::class, 'collection_sample']); |
実行して確認
Collection::collectメソッドの実行結果を確認します。
Laravelでサーバーを立ち上げるコマンドは
1 |
php artisan serve |
です。
サーバーを立ち上げるコマンドの詳細な説明は、こちらの記事をご参考ください。
- http://〇〇〇.〇〇〇.〇〇〇.〇〇〇:8000/sample
※コマンドプロンプトに記載されているURL - http://localhost:8000/sample
どちらかのURLにアクセスします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
抽出条件を指定した場合 fruit_collectionを表示 object(Illuminate\Support\Collection)#291 (2) { ["items":protected]=> array(5) { [0]=> string(5) "apple" [1]=> string(6) "grapes" [2]=> string(10) "tangerines" [3]=> string(4) "kiwi" [4]=> string(9) "pineapple" } ["escapeWhenCastingToString":protected]=> bool(false) } Collection::filterメソッドで5文字より長いものだけ取得 object(Illuminate\Support\Collection)#292 (2) { ["items":protected]=> array(3) { [1]=> string(6) "grapes" [2]=> string(10) "tangerines" [4]=> string(9) "pineapple" } ["escapeWhenCastingToString":protected]=> bool(false) } 抽出条件を指定しない場合 no_condition_collectionを表示 object(Illuminate\Support\Collection)#280 (2) { ["items":protected]=> array(7) { [0]=> string(3) "aaa" [1]=> int(0) [2]=> string(3) "bbb" [3]=> bool(false) [4]=> string(3) "ccc" [5]=> string(0) "" [6]=> string(3) "ddd" } ["escapeWhenCastingToString":protected]=> bool(false) } Collection::filterメソッドでfalseになるものだけ取得 object(Illuminate\Support\Collection)#294 (2) { ["items":protected]=> array(4) { [0]=> string(3) "aaa" [2]=> string(3) "bbb" [4]=> string(3) "ccc" [6]=> string(3) "ddd" } ["escapeWhenCastingToString":protected]=> bool(false) } |
抽出条件を指定した場合は満たす要素のみ、抽出条件を指定しなかった場合はfalseとなる要素が取り除かれたCollectionインスタンスが返されていることを確認できました。
まとめ:Collection::filterメソッドを使ってみよう
以上がLaravelで指定したCollectionインスタンスから条件を満たす要素を抽出できるCollection::filterメソッドの解説でした!
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント