PHP 8.4 は 2024 年 11 月にリリースされる予定で、いくつかの便利な新しい配列関数が導入されます:
この記事では、これらの新しい関数と、PHP 8.4 を実行しているプロジェクトでそれらの関数を使用する方法について簡単に説明します。
Laravel 開発者であれば、Illuminate\Support\Collection クラスと Illuminate\Support\Arr クラスに同様の関数がすでに存在していることに気づくかもしれません。しかし、これらの関数が PHP にネイティブであるため、どの PHP プロジェクトでも利用できることが気に入っています。
Laravel 開発者の読者のために、PHP 8.4 を待たずに Laravel プロジェクトで同じ機能を実現できるように、これらの新しい関数と同等の Laravel 関数を示します。
PHP 8.4 の新しい「プロパティ フック」機能について詳しく説明した私の他の記事もチェックしてみることに興味があるかもしれません。
array_find 関数は、コールバックで定義された条件に一致する最初の要素の値を返します。コールバックに一致する要素がない場合、関数は null.
を返します。簡単な例を見てみましょう。一連の製品があり、バーコード 123456:
を持つ製品を検索するとします。
$products = [ [ 'name' => 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ], [ 'name' => 'Framework Laptop 13', 'type' => 'Laptop', 'barcode' => 789012, ], [ 'name' => 'Samsung Galaxy S24', 'type' => 'Phone', 'barcode' => 135791, ], ]; // Find the product with barcode 123456 $findProduct = array_find( array: $products, callback: function (array $product): bool { return $product['barcode'] == 123456; }, );
上記のコードを実行すると、$findProduct は次のようになります:
[ 'name'=> 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ]
2 番目の引数としてアロー関数を使用することで、これをもう少し整理できます:
$findProduct = array_find( array: $products, callback: fn (array $product): bool => $product['barcode'] === 123456, );
上記のコードは、前の例と同じ結果を返します。
コールバックに一致する要素がない場合、関数は null を返します。この例を見てみましょう:
$nonExistentProduct = array_find( array: $products, callback: fn (array $product): bool => $product['barcode'] === 'invalid', );
この場合、$nonExistentProduct は null になります。
Laravel では、Arr::first メソッドを使用して同様の結果を達成できます:
use Illuminate\Support\Arr; $findProduct = Arr::first( $products, fn (array $product): bool => $product['barcode'] === 123456, );
この関数は array_find 関数に似ていますが、コールバックに一致する最初の要素の値を返す代わりに、コールバックに一致する最初の要素のキーを返します。
先ほどの $products 配列の例を見てみましょう。今回は、バーコード 789012:
の製品のキーを見つけたいと考えています。
$products = [ [ 'name' => 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ], [ 'name' => 'Framework Laptop 13', 'type' => 'Laptop', 'barcode' => 789012, ], [ 'name' => 'Samsung Galaxy S24', 'type' => 'Phone', 'barcode' => 135791, ], ]; // Find the key of the product with barcode 789012 $findProduct = array_find_key( array: $products, callback: fn (array $product): bool => $product['barcode'] === 789012, );
上記のコードを実行すると、product が配列の 2 番目の要素であるため、$findProduct は 1 になります。
コールバックに一致する要素がない場合、関数は null を返します。この例を見てみましょう:
$nonExistentProduct = array_find_key( array: $products, callback: fn (array $product): bool => $product['barcode'] === 'invalid', );
この場合、$nonExistentProduct は null になります。
Laravel では、array_keys メソッドと Arr::first メソッドを組み合わせて使用すると、同様の結果を達成できます:
use Illuminate\Support\Arr; $firstProductKey = Arr::first( array_keys($products), fn (int $key): bool => $products[$key]['barcode'] === 789012, );
上記のコードでは、まず array_keys を使用して $products 配列のキーの配列を取得しています。次に、Arr::first を使用して、コールバックに一致する最初のキーを見つけます。これはネイティブ PHP 関数よりも少し冗長ですが、同じ結果が得られます。
array_any 関数を使用すると、配列内の少なくとも 1 つの要素がコールバックで定義された基準に一致するかどうかを確認できます。いずれかの要素がコールバックに一致する場合、関数は true を返します。コールバックに一致する要素がない場合、関数は false を返します。
$products 配列の例をそのまま使用して、製品のタイプが Laptop であるかどうかを確認してみましょう:
$anyProductsAreLaptops = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
この場合、配列内の製品の少なくとも 1 つはラップトップであるため、$anyProductsAreLaptops は true になります。
コールバックに一致する要素がない場合、関数は false を返します。この例を見てみましょう:
$anyProductsAreInvalid = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Invalid', );
この場合、$anyProductsAreInvalid は false になります。
コレクションの contains メソッドを使用して、Laravel でも同じ結果を達成できます:
use Illuminate\Support\Collection; $anyProductsAreLaptops = Collection::make($products)->contains( fn (array $product): bool => $product['type'] === 'Laptop', );
上記のコードでは、$products 配列からコレクションを作成し、contains メソッドを使用してコレクション内の製品がラップトップであるかどうかを確認しています。
array_all 関数は array_any 関数に似ていますが、少なくとも 1 つの要素がコールバックに一致するかどうかをチェックするのではなく、すべての要素がコールバックに一致するかどうかをチェックします。すべての要素がコールバックに一致する場合、関数は true を返します。いずれかの要素がコールバックと一致しない場合、関数は false を返します。
$products 配列内のすべての製品がラップトップかどうかを確認してみましょう:
$allProductsAreLaptops = array_all( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
この場合、配列内のすべての製品がラップトップであるわけではないため、$allProductsAreLaptops は false になります。
Laravel では、コレクションのすべてのメソッドを使用して同じ結果を達成できます:
use Illuminate\Support\Collection; $allProductsAreLaptops = Collection::make($products)->every( fn (array $product): bool => $product['type'] === 'Laptop', );
上記のコードでは、$products 配列からコレクションを作成し、every メソッドを使用してコレクション内のすべての製品がラップトップかどうかを確認しています。
この記事で、PHP 8.4 で利用可能になる新しい配列関数の使用方法を説明できれば幸いです。また、Illuminate\Support\Collection クラスと Illuminate\Support\Arr クラスを使用して、Laravel で同様の機能を実現する方法についても理解できたはずです。
この記事を読んで気に入っていただけたなら、同様のトピックをさらに詳しく扱った私の 220 ページの電子書籍「Battle Ready Laravel」をチェックしてみることに興味があるかもしれません。
または、私の他の 440 ページの電子書籍「Laravel での API の使用」をチェックしてみてください。Laravel を使用して他のサービスから API を使用する方法が説明されています。
私が新しい投稿を公開するたびに最新情報を受け取ることに興味がある場合は、お気軽にニュースレターに登録してください。
これからも素晴らしいものを作り続けてください! ?
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3