PHP 8.4 中的新数组函数

6666 2024-08-24 684 阅读 0评论

介绍

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 类实现类似的功能。

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

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 684人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表