初めに
PHPのORMとして知られるDoctrineにはCollectionsと呼ばれるモジュールが存在します。
今回は、その中の機能の一つであるArrayCollectionでよく使うメソッドについて解説します。
便利メソッド3選
今回紹介するのは以下の3つです。
- filter
- map
- forAll
filter
名前の通り、条件に合う要素のみを抽出するメソッドです。
filterの引数に戻り値がbool型のコールバック関数を渡すことで、条件に合う要素のみを抽出します。
コールバック関数に渡せるのは値だけであり、キーを渡すことはできません。
// ArrayCollection作成
$array = ['key1' => 1, 'key2' => 2, 'key3' => 3];
$arrayCollection = new ArrayCollection($array);
// filter処理
$result = $arrayCollection->filter(function($value){
return $value >= 2;
});
// $result = ['key2' => 2, 'key3' => 3];
map
foreachのように、各要素に対して処理を適用します。
filter同様、配列のキーを渡すことはできません。
// ArrayCollection作成
$array = ['key1' => 1, 'key2' => 2, 'key3' => 3];
$arrayCollection = new ArrayCollection($array);
// map処理
$result = $arrayCollection->map(function($value){
return "value is " . $value;
});
// $result = ['key1' => value is 1, 'key2' => value is 2, 'key3' => value is 3];
forAll
全ての要素が条件に当てはまるかどうかを判定する処理です。
filterやmapと違い、コールバック関数にキーを渡すことができます。
// ArrayCollection作成
$array = ['key1' => 1, 'key2' => 2, 'key3' => 3];
$arrayCollection = new ArrayCollection($array);
// forAll処理
$result = $arrayCollection->forAll(function($key, $value){
return $value >= 2;
});
// $result = false
おすすめポイント
map、filter、forAllなどを用いると、簡単な処理でifやforeachを使う必要がなくなります。
ネストの深さを抑えられ、比較的読みやすいコードになります。
例えば、以下の二つは同じ結果になりますが、後者のほうがすっきりしていて個人的には好きです。
// ArrayCollection作成
$array = ['key1' => 1, 'key2' => 2, 'key3' => 3];
$arrayCollection = new ArrayCollection($array);
// foreachとifで頑張る
$result = [];
foreach($arrayCollection as $key => $value) {
if ($this->isValid($value)) {
$result[$key] = "value is " . $value;
}
}
// ArrayCollection作成
$array = ['key1' => 1, 'key2' => 2, 'key3' => 3];
$arrayCollection = new ArrayCollection($array);
// mapとfilter
$result = $arrayCollection
->filter(fn($value) => $this->isValid($value))
->map(fn($value) => "value is " . $value);
すっきりするものの、↑のような記述だとfilterとmapのそれぞれで繰り返し処理を回すことになるので、パフォーマンスは微妙かもですね
PHP組み込み関数のarray_mapやarray_filterでも同様のことはできませす。ArrayCollectionを用いない場合は配列をわざわざ変換する必要もないので、これらの組み込み関数を用いるのがいいと思います。
終わりに
Doctrineを使う場合、filterやmapを用いることですっきりとしたコードを書くことができるようになりますね。アロー関数を使うと、モダンな雰囲気を感じることができて非常に好みです。これからも使おうと思います。
ここまで読んでいただきありがとうございました!