PHP 8.4 将于 2024 年 11 月发布,并将引入一些方便的新数组函数:
在本文中,我们将快速浏览这些新函数以及如何在运行 PHP 8.4 的项目中使用它们。
如果您是 Laravel 开发人员,您可能会注意到我们在 Illuminate\Support\Collection 和 Illuminate\Support\Arr 类中已经有了类似的函数。但我喜欢这些函数是 PHP 原生的,因此可以在任何 PHP 项目中使用。
对于任何作为 Laravel 开发人员的读者,我将向您展示这些新功能的 Laravel 等效项,以便您可以在 Laravel 项目中实现相同的功能,而无需等待 PHP 8.4。
您可能还有兴趣查看我的另一篇文章,其中讨论了 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, ]
我们可以通过使用箭头函数作为第二个参数来进一步清理它:
$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, );
运行上面的代码后,$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 函数允许您检查数组中至少一个元素是否符合回调中定义的条件。如果任何元素与回调匹配,则该函数返回 true。如果没有元素与回调匹配,则函数返回 false。
继续使用我们的 $products 示例数组,让我们检查是否有任何产品具有笔记本电脑类型:
$anyProductsAreLaptops = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
在这种情况下,$anyProductsAreLaptops 将等于 true,因为数组中至少有一个产品是笔记本电脑。
如果没有元素与回调匹配,函数将返回 false。让我们看一个例子:
$anyProductsAreInvalid = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Invalid', );
在这种情况下,$anyProductsAreInvalid 将等于 false。
我们可以在 Laravel 中使用集合上的 contains 方法达到相同的结果:
use Illuminate\Support\Collection; $anyProductsAreLaptops = Collection::make($products)->contains( fn (array $product): bool => $product['type'] === 'Laptop', );
在上面的代码中,我们从 $products 数组创建一个集合,然后使用 contains 方法检查集合中是否有任何产品是笔记本电脑。
array_all 函数与 array_any 函数类似,但它不是检查是否至少有一个元素与回调匹配,而是检查所有元素是否与回调匹配。如果所有元素都与回调匹配,则该函数返回 true。如果任何元素与回调不匹配,则函数返回 false。
让我们检查一下 $products 数组中的所有产品是否都是笔记本电脑:
$allProductsAreLaptops = array_all( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
在这种情况下,$allProductsAreLaptops 将等于 false,因为并非数组中的所有产品都是笔记本电脑。
在 Laravel 中,我们可以使用集合上的 every 方法达到相同的结果:
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 页电子书“Consuming APIs in Laravel”,它教您如何使用 Laravel 来使用来自其他服务的 API。
如果您有兴趣在我每次发布新帖子时获得更新,请随时订阅我的时事通讯。
继续打造精彩的东西! ?
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3