介绍

PHP 8.4 预计将于 2024 年 11 月发布,届时将带来一系列令人期待的新特性,其中包括几项便捷的数组函数

本文将带您快速了解这些新函数,并展示如何在您的 PHP 8.4 项目中运用它们。

函数array_find

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,
    ],
];

// 查找条形码为 123456 的产品
$findProduct = array_find(
    array: $products,
    callback: function (array $product): bool {
        return $product['barcode'] == 123456;
    },
);

运行上述代码后,$findProduct将等于:

[
    'name'=> 'Macbook Pro',
    'type' => 'Laptop',
    'barcode' => 123456,
]

我们可以通过使用箭头函数作为第二个参数来进一步清理它:

$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 等效

在 Laravel 中,你可以使用以下方法实现类似的结果Arr::first

use Illuminate\Support\Arr;

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

函数array_find_key

array_find_key 函数与 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,
    ],
];

// 找到条形码为 789012 的产品的键
$findProduct = array_find_key(
    array: $products,
    callback: fn (array $product): bool => $product['barcode'] === 789012,
);

运行上述代码后,$findProduct将等于,1因为乘积是数组中的第二个元素。

如果没有元素与回调匹配,函数将返回null。

让我们看一个例子:

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

在这种情况下,$nonExistentProduct将等于null。

Laravel 等效

在 Laravel 中,你可以结合使用array_keysArr::first方法来实现类似的结果:

use Illuminate\Support\Arr;

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

上述代码片段展示了如何使用 array_keys 和 Arr::first 函数来查找符合特定条件的元素的键名。

首先,我们使用 array_keys 获取 $products 数组的所有键名,并存储在一个新的数组中。然后,我们使用集合方法 Arr::first 遍历这个键名数组,并找到第一个符合回调函数条件的键名。

虽然这种方法比直接使用原生的 array_find_key 函数稍微冗长一些,但它提供了一种 alternative 的实现方式,并且在某些场景下可能更加灵活。

函数array_any

array_any 函数用于检查数组中是否至少存在一个元素满足特定条件。如果存在符合条件的元素,则返回 true,否则返回 false。

让我们继续以 $products 产品数组为例,这次我们想要检查是否有任何产品的类型为 Laptop:

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

在上面的代码中,由于 $products 数组中至少存在一个类型为 Laptop 的产品,因此 $anyProductsAreLaptops 变量的值将为 true。

如果数组中没有任何元素满足回调函数的条件,array_any 函数将会返回 false。让我们来看一个例子:

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

在这种情况下,$anyProductsAreInvalid将等于false。

Laravel 等效

我们可以使用 Laravel 中的 contains 方法在集合上实现相同的结果:

use Illuminate\Support\Collection;

$anyProductsAreLaptops = Collection::make($products)->contains(
    fn (array $product): bool => $product['type'] === 'Laptop',
);

在上面的代码中,我们从数组创建一个集合$products,然后使用该contains方法来检查集合中是否有任何产品是笔记本电脑。

函数array_all

array_all 函数与 array_any 函数功能相似,但更加严格。 array_any 函数仅检查数组中是否存在至少一个满足条件的元素,而 array_all 函数则要求数组中的所有元素都必须满足条件才会返回 true,否则返回 false。

换句话说,只要数组中存在任何一个元素不符合回调函数定义的条件,array_all 函数就会返回 false。

让我们检查一下数组中的所有产品是否$products都是笔记本电脑:

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

在这种情况下,$allProductsAreLaptops将等于,false因为数组中并非所有产品都是笔记本电脑。

Laravel 等效

在 Laravel 中,我们可以使用集合上的方法实现相同的结果:

use Illuminate\Support\Collection;

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

在上面的代码中,我们从数组创建一个集合$products,然后使用该every方法来检查集合中的所有产品是否都是笔记本电脑。

结论

希望本文能帮助您了解如何在 PHP 8.4 中使用新增的便捷数组函数。同时,也向您展示了如何在 Laravel 项目中借助 Illuminate\Support\Collection 类和 Illuminate\Support\Arr 类实现类似的功能。

这些新函数和工具将为您处理数组操作提供更多选择,并提升您的代码效率。