2、PHP 8.4 新特性 - 新的 array_find,array_find_key,array_any 和 array_all函数

作者: 温新

图书: 【PHP 8.4 新特性】

阅读: 283

时间: 2025-02-11 02:18:36

\PHP 8.4 添加了四个新的数组函数,用于使用回调函数搜索和检查数组元素:array_findarray_find_keyarray_allarray_any

这些新函数为常见的操作提供了便捷的方法,例如查找符合特定条件的数组元素(通过提供的回调函数检查),以及检查数组中是否有任何或所有元素符合特定条件。

PHP 8.4 新增的用于通过回调函数查找数组元素的函数:

  • array_find:返回数组中第一个使回调函数返回 true 的元素的值;否则返回 null
  • array_find_key:返回数组中第一个使回调函数返回 true 的元素的键名;否则返回 null

PHP 8.4 新增的用于检查数组中是否有任何或所有元素通过回调函数检查的函数:

  • array_all:检查回调函数是否对所有数组元素都返回 true
  • array_any:检查回调函数是否对任何数组元素返回 true

array_find

array_find 函数返回数组中第一个使回调函数返回 true 的元素的值。如果没有任何元素使回调函数返回 true,则 array_find 函数返回 null

/**
 * 返回 $array 中第一个使 $callback 返回 true 的元素的值。如果没有找到匹配的元素,返回 NULL。
 *
 * @param array $array 应该搜索的数组。
 * @param callable $callback 用于检查每个元素的回调函数。第一个参数包含值 ($value),第二个参数包含对应的键 ($key)。如果此回调返回 TRUE(或真值),则立即返回该值 ($value),并且不会对后续元素调用回调。
 *
 * @return mixed 该函数返回第一个使 $callback 返回 TRUE 的元素的值。如果没有找到匹配的元素,返回 NULL。
 * 注意,匹配的元素值本身也可能是 NULL。
 */
function array_find(array $array, callable $callback): mixed {}

array_find 用法

案例一:查找数组中的第一个偶数
<?php
    
$array = [1, 3, 5, 8, 10];
$result = array_find($array, fn(int $value) => $value % 2 === 0);
echo $result;

在这个例子中,array_find 查找第一个偶数,并返回 8

案例二:没有符合条件的元素返回 NULL
<?php
    
$array = [1, 3, 5, 7, 9];
$result = array_find($array, fn(int $value) => $value % 2 === 0);
var_dump($result);exit;

当数组中没有符合条件的元素时,array_find 返回 NULL

案例三:查找对象数组中的第一个特定对象

<?php
    
class Person
{
    public function __construct(
        public string $name,
        public int $age,
    )
    {
    }
}

$peopleObj = [
    new Person('王美丽', 18),
    new Person('郝帅', 20),
    new Person('赵六', 21),
];

$result = array_find($peopleObj, fn($person) => $person->age > 18);
echo $result->name;
echo $result->age;

array_find_key

array_find_key从数组中查找第一个满足回调函数条件的元素,并返回该元素的 key。如果没有找到符合条件的元素,则返回 null

/**
 * 返回 $array 中第一个使 $callback 返回 TRUE 的元素的键。如果没有找到匹配的元素,
 * 则该函数返回 NULL。
 *
 * @param array $array 要搜索的数组。
 * @param callable $callback 用于检查每个元素的回调函数。第一个参数包含值 ($value),
 * 第二个参数包含对应的键 ($key)。如果此函数返回 TRUE,则立即返回该键 ($key),
 * 并且不会对后续元素调用回调函数。
 *
 * @return mixed 第一个使 $callback 返回 TRUE 的元素的键。如果没有找到匹配的元素,则返回 NULL。
 */
function array_find_key(array $array, callable $callback): mixed {}

array_find_key 用法

案例一:查找第一个偶数的键
<?php

$array = [1, 3, 4, 7, 8];
$key = array_find_key($array, fn($value, $key) => $value % 2 === 0);
echo $key; // 2
案例二:查找满足特定条件的键
<?php

$users = [
    'user1' => ['name' => '王美丽', 'age' => 18],
    'user2' => ['name' => '郝帅', 'age' => 19],
    'user3' => ['name' => '六六', 'age' => 20],
];

$key = array_find_key($users, fn($user, $key) => $user['age'] > 18);
echo $key; // user2

回调函数检查用户年龄大于 18user2 符合条件,因此返回其键 user2

案例三:如果没有匹配的元素
<?php

$array = [1, 3, 5, 7];
$key = array_find_key($array, fn($value, $key) => $value > 10);
var_dump($key); // 输出 NULL
案例四:结合键值一起判断
<?php

$array = ['a' => 10, 'b' => 20, 'c' => 30];
$key = array_find_key($array, fn($value, $key) => $key === 'b' && $value > 15);
echo $key; // 输出 b

array_all

array_all 函数接收一个数组和一个回调函数,如果数组中的所有元素在传递给回调函数时都返回 true,则该函数返回 true

回调函数会使用给定数组中每个元素的值($value)和键($key)进行调用。

对于空数组([]),array_all 返回 true

/**
 * 检查 $callback 是否对数组中的所有元素都返回 TRUE。
 *
 * @param array $array 要搜索的数组。
 * @param callable $callback 用于检查每个元素的回调函数。第一个参数包含值 ($value),第二个参数包含对应的键 ($key)。如果此函数返回 FALSE(或任何假值),则立即返回 FALSE,并且不会对后续元素调用 $callback。
 *
 * @return bool 如果 $callback 对所有元素都返回 TRUE,则返回 TRUE。否则返回 FALSE。
 */
function array_all(array $array, callable $callback): bool {}
案例一:检查所有元素是否为正数
<?php

$array = [1, 2, 3, 4, 5];
$result = array_all($array, fn($value) => $value > 0);
var_dump($result); // 输出: bool(true)
案例二:检查是否所有字符串长度超过 3
<?php

$array = ["hello", "world", "php"];
$result = array_all($array, fn($value) => strlen($value) > 3);

var_dump($result); // 输出: bool(false)

案例三:检查键值对条件

<?php

$array = ['a' => 10, 'b' => 20, 'c' => 30];
$result = array_all($array, fn($value, $key) => $key !== 'd' && $value > 0);
// 回调函数检查数组的每个键和值,所有元素的键都不是 d 且值大于 0,满足条件,因此返回 true
var_dump($result); // 输出: bool(true)

array_any

array_any 用于检查数组中是否 至少有一个元素 满足给定的条件。它接收一个数组和一个回调函数,如果数组中的任何元素在传递给回调函数时返回 true,则该函数返回 true

回调函数会使用给定数组中每个元素的值($value)和键($key)进行调用。一旦回调函数对第一个元素返回 true,则不会对数组中的其余元素调用回调函数。

对于空数组([]),array_any 返回 false

/**
 * 检查 $callback 是否对数组中的任意一个元素返回 TRUE。
 *
 * @param array $array 要搜索的数组。
 * @param callable $callback 用于检查每个元素的回调函数。第一个参数包含值 ($value),第二个参数包含对应的键 ($key)。如果此函数返回 TRUE(或任何真值),则立即返回 TRUE,并且不会对后续元素调用 $callback。
 *
 * @return bool 如果至少有一个元素使 $callback 返回 TRUE,则返回 TRUE。否则返回 FALSE。
 */
function array_any(array $array, callable $callback): bool {}
案例一:检查是否有正数
<?php

$array  = [-1, -2, 3, -4, -5];
$result = array_any($array, fn($value) => $value > 0);
// 数组中存在一个正数 3,满足条件,因此返回 true
var_dump($result); // bool(true)
案例二:检查是否有字符串包含特定子字符串
<?php

$array = ["apple", "banana", "cherry"];
$result = array_any($array, fn($value) => str_contains($value, "na"));
// 字符串 banana 包含子字符串 na,满足条件,因此返回 true。
var_dump($result); // bool(true)
案例三:如果没有任何元素满足条件
<?php
    
$array = [1, 3, 5, 7];
$result = array_any($array, fn($value) => $value % 2 === 0);
var_dump($result); // bool(false)
案例四:结合键和值判断
<?php
    
$array = ['a' => 10, 'b' => 20, 'c' => 30];
$result = array_any($array, fn($value, $key) => $key === 'b' && $value > 15);
var_dump($result); // bool(true)

注意事项:

空数组处理 如果数组为空,array_any 默认返回 false,因为没有元素可以满足条件。

$array = [];
$result = array_any($array, fn($value) => $value > 0);
var_dump($result); // bool(false)

效率优势 一旦找到第一个满足条件的元素,array_any 会立即返回 true,无需遍历整个数组。

array_all VS array_any

函数 意义 返回值
array_all 检查是否所有元素都满足条件 true:所有满足;false:否则
array_any 检查是否至少有一个元素满足条件 true:存在满足;false:否则

向后兼容性影响

array_findarray_find_keyarray_allarray_any 函数是新添加到全局命名空间的函数。除非用户已经定义了同名的函数,否则这一变化应该不会引入任何向后兼容性问题。

这些新函数也可以在用户级的 PHP 中轻松实现。

polyfills/array_find 包提供了 array_find、array_find_key、array_all 和 array_any 函数的 PHP 多版本支持,支持 PHP 7.1 及以上版本。

以下 Composer 命令可以安装该包:

composer require polyfills/array-find
请登录后再评论