PHP 8.4 引入的陣列函數:array_find()、array_find_key()、array_any() 和 arr_all()

前言

PHP 8.4 將於 2024 年 11 月發布,並將引入一些方便的陣列函數(array function):

  • array_find
  • array_find_key
  • array_any
  • array_all

如果你/妳曾使用過 Laravel 框架進行開發,這些函數的功能會與 Illuminate\Support\CollectionIlluminate\Support\Arr 中的部分函數與方法類似。而現在他們有了原生 PHP 的支持!在本文中將快速瀏覽這些新函數,以及說明如何在執行 PHP 8.4 的專案中使用它們。

array_find() 函數

在 Laravel 中,我們可以使用 Arr:first 從給定陣列中找到第一個符合條件的元素,當找不到符合回調函數(callback function)時,則返回 null 值:

use Illuminate\Support\arr;

$findProduct = Arr::first(
    $products,
    fn (array $product): bool => $product['barcode'] === 5566,
);

而在 PHP 8.4 中,上述的程式碼可以改成這樣實現:

$findProduct = array_find(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 5566,
);

array_find_key() 函數

在 Laravel 中,有時候我們想要取得的是符合條件元素的鍵(key),此時可以簡單地調整回調函數中的內容:

use Illuminate\Support\Arr;

$firstProductKey = Arr::first(
    array_keys($products),
    fn (int $key): bool => $products[$key]['barcode'] === 5566,
);

而在 PHP 8.4 中,可以使用 array_find_key() 來處理,寫法更加地直觀:

$findProduct = array_find_key(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 5566,
);

array_any() 函數

在 Laravel 中,我們可以使用 Collection 物件的 contains() 方法,來檢查給定的陣列中,是否至少含有一項滿足條件的元素:

use Illuminate\Support\Collection;
 
$anyProductsAreCameras = Collection::make($products)->contains(
    fn (array $product): bool => $product['type'] === 'Camera',
);

而在 PHP 8.4 中,可以使用 array_any 來實現:

$anyProductsAreCameras = array_any(
    array: $products,
    callback: fn (array $product): bool => $product['type'] === 'Camera',
);

array_all() 函數

在 Laravel 中,我們可以使用 Collection 物件的 every() 方法,來檢查給定的陣列中,是否所有元素都滿足指定條件:

use Illuminate\Support\Collection;
 
$allProductsAreLaptops = Collection::make($products)->every(
    fn (array $product): bool => $product['type'] === 'Laptop',
);

而在 PHP 8.4 中,可以使用 array_all 來實現:

$allProductsAreLaptops = array_all(
    array: $products,
    callback: fn (array $product): bool => $product['type'] === 'Laptop',
);