0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Doctrine】ArrayCollectionの便利メソッド3選(filter, map, forAll)

Last updated at Posted at 2024-10-26

初めに

PHPのORMとして知られるDoctrineにはCollectionsと呼ばれるモジュールが存在します。
今回は、その中の機能の一つであるArrayCollectionでよく使うメソッドについて解説します。

便利メソッド3選

今回紹介するのは以下の3つです。

  • filter
  • map
  • forAll

filter

名前の通り、条件に合う要素のみを抽出するメソッドです。
filterの引数に戻り値がbool型のコールバック関数を渡すことで、条件に合う要素のみを抽出します。
コールバック関数に渡せるのは値だけであり、キーを渡すことはできません。

filterの例
// 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同様、配列のキーを渡すことはできません。

mapの例
// 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と違い、コールバック関数にキーを渡すことができます。

forAllの例
// 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を使う必要がなくなります。
ネストの深さを抑えられ、比較的読みやすいコードになります。

例えば、以下の二つは同じ結果になりますが、後者のほうがすっきりしていて個人的には好きです。

foreachとifを用いる
// 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;
    }
}
mapやfilterを用いる
// 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のそれぞれで繰り返し処理を回すことになるので、パフォーマンスは微妙かもですね:sweat:

PHP組み込み関数のarray_maparray_filterでも同様のことはできませす。ArrayCollectionを用いない場合は配列をわざわざ変換する必要もないので、これらの組み込み関数を用いるのがいいと思います。

終わりに

Doctrineを使う場合、filterやmapを用いることですっきりとしたコードを書くことができるようになりますね。アロー関数を使うと、モダンな雰囲気を感じることができて非常に好みです。これからも使おうと思います。

ここまで読んでいただきありがとうございました!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?