PHP8.4でリリースされた新しい配列関数を紹介!
初めまして!
社会人1年目 システム開発部のいおさです!
最近一気に寒くなりましたね。寒くなると寂しくなるのはなぜなんでしょう?
まあ、そんなことは置いといて PHP8.4 がリリースされましたね!!
弊社ではPHPをメインに開発を行っているのですが、今回追加された配列関数が使い勝手良さそうだったので紹介したいと思います!
追加された配列関数
今回追加されたのは
- array_find()
- array_find_key()
- array_any()
- array_all()
の4つになります!
全ての関数で第一引数に配列、第二引数にコールバック関数を渡すことで使用できます。
またコールバック関数のシグネチャは以下のようになっており、第一引数を要素の値、第二引数を要素のキーとして使うことができます。
callback(mixed $value, mixed $key): bool
それでは紹介していきます!!
array_find関数
まず最初は array_find関数 です!
この関数はコールバック関数がtrueを返す最初の要素の値を返してくれて、もし見つからなかった場合nullを返してくれます。
以下が使用例になります!
$array = [ 'tamabaritake' => 'enoki', 'haratake' => 'shiitake', 'hiratake' => 'eringi', ]; // 配列の値が6文字より長い要素を探す $result = array_find($array, function (string $value){ return strlen($value) > 6; }); var_dump($result); // 結果: string(8) "shiitake"
上記のように、コールバック関数内のstrlen($value) > 6でtrueになった値を返してくれます。
また、以下のようにコールバック関数がtrueを返す値が複数ある場合は、最初の要素のみ返してくれます。
// ※配列の値は同じです // 配列の値がeから始まる要素を探す $result = array_find($array, function (string $value){ return str_starts_with($value, 'e'); }); var_dump($result); // 結果: string(5) "enoki"
もしかしたらPHPのフレームワークであるLaravelを使われている人だと気づいてるかもしれませんが、ヘルパ関数のArr::firstと同じ挙動(関数内の処理もほとんど同じ)になっています!
array_find_key関数
次は array_find_key関数 です!
この関数はコールバック関数がtrueを返す最初の要素のキー返してくれて、もし見つからなかった場合nullを返してくれます。
以下が使用例になります!
$array = [ 'tamabaritake' => 'enoki', 'haratake' => 'shiitake', 'hiratake' => 'eringi', ]; // 配列の値が6文字より長いものを探す $result = array_find_key($array, function (string $value){ return strlen($value) > 6; }); var_dump($result); // 結果:string(8) "haratake"
上記のように探したのは配列の値が6文字より長い要素ですが、返り値はその要素のキーになっています。
また、array_find関数と同様にコールバック関数がtrueを返す値が複数あった場合は、最初の要素のキーのみ返してくれます。
// ※配列の値は同じです // 配列の値がeから始まる要素を探す $result = array_find_key($array, function (string $value){ return str_starts_with($value, 'e'); }); var_dump($result); // 結果: string(12) "tamabaritake"
今まで似たような関数で特定の値のみ調べて対応するキーを返すarray_search関数というのがありました。
しかし、array_find_key関数を使うことで、コールバック内で自分が設定した条件や正規表現などが使用でき、自由度が高くて色々な所で使いやすいと思います!
array_any関数
次はarray_any関数になります!
この関数はコールバック関数がtrueを返す要素が少なくとも1つある場合はtrueを返してくれて、ない場合はfalseを返してくれます。
以下が使用例になります!
$array = [ 'tamabaritake' => 'enoki', 'haratake' => 'shiitake', 'hiratake' => 'eringi', ]; // いずれかの値がmから始まる要素があるか $result = array_any($array, function (string $value){ return str_starts_with($value, 'm'); }); var_dump($result); // 結果: bool(false) // いずれかの値が6文字より長いものがあるか $result = array_any($array, function (string $value){ return strlen($value) > 6; }); var_dump($result); // 結果: bool(true)
こちらもLaravelのCollectionクラスにあるcontainsメソッドと同じ挙動をします!(内部処理は違いますが...)
containsメソッドを使っていた人にとってはarray_any関数の挙動も想像しやすいと思います。
array_all関数
最後は array_all関数 です!
この関数はコールバック関数がtrueを返す要素が全てある場合はtrueを返してくれて、ない場合はfalseを返してくれます。
以下が使用例になります!
$array = [ 'tamabaritake' => 'enoki', 'haratake' => 'shiitake', 'hiratake' => 'eringi', ]; // 全ての値がeから始まるか $result = array_all($array, function (string $value){ return str_starts_with($value, 'e'); }); var_dump($result); // 結果: bool(false) // 全ての配列キーがtakeで終わるか $result = array_any($array, function (string $value, string $key){ return preg_match('/.*take$/', $key); }); var_dump($result); // 結果: bool(true)
こちらもarray_any関数と同じで、LaravelのCollectionクラスにあるメソッドにあるeveryメソッドと同じ挙動をします。
まとめ
いかかがだったでしょうか!
上記のメソッドの詳しい説明は公式ドキュメントに記述してありますので、ぜひそちらも併せて確認してみてください!
追加された関数一覧 : https://www.php.net/releases/8.4/ja.php#new_array_find
個人的には新しい配列関数ではコールバック関数が使える分、汎用性があり使い勝手の良さそうな印象を受けました。
また、Laravelから流用やインスパイアを受けたものが多かったのかなと思います。
今後もこのような流れが増えて、PHPの言語自体の利便性が良くなれば嬉しいですね!
こんな関数あったなーという程度で覚えていただければ幸いです!