PHP 8.4 中的新数组函数
介绍
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_keys
和Arr::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
类实现类似的功能。
这些新函数和工具将为您处理数组操作提供更多选择,并提升您的代码效率。
发表评论