”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > PHP 中的新数组函数

PHP 中的新数组函数

发布于2024-08-21
浏览:703

New Array Functions in PHP

介绍

PHP 8.4 将于 2024 年 11 月发布,并将引入一些方便的新数组函数:

  • 数组查找
  • 数组查找键
  • array_any
  • 数组全部

在本文中,我们将快速浏览这些新函数以及如何在运行 PHP 8.4 的项目中使用它们。

如果您是 Laravel 开发人员,您可能会注意到我们在 Illuminate\Support\Collection 和 Illuminate\Support\Arr 类中已经有了类似的函数。但我喜欢这些函数是 PHP 原生的,因此可以在任何 PHP 项目中使用。

对于任何作为 Laravel 开发人员的读者,我将向您展示这些新功能的 Laravel 等效项,以便您可以在 Laravel 项目中实现相同的功能,而无需等待 PHP 8.4。

您可能还有兴趣查看我的另一篇文章,其中讨论了 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,
    ],
];

// 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 等效项

在 Laravel 中,您可以使用 Arr::first 方法获得类似的结果:

use Illuminate\Support\Arr;

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

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

// 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 等效项

在 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 函数

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

我们可以在 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 函数类似,但它不是检查是否至少有一个元素与回调匹配,而是检查所有元素是否与回调匹配。如果所有元素都与回调匹配,则该函数返回 true。如果任何元素与回调不匹配,则函数返回 false。

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

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

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

Laravel 等效项

在 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。

如果您有兴趣在我每次发布新帖子时获得更新,请随时订阅我的时事通讯。

继续打造精彩的东西! ?

版本声明 本文转载于:https://dev.to/ashallendesign/new-array-functions-in-php-84-nbl?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-06-09
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-06-09
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-06-09
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-06-09
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-06-09
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-06-09
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-06-09
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-06-09
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-06-09
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-06-09
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-06-09
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-06-09
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    编程 发布于2025-06-09
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-06-09
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-06-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3