编程

PHP 8.6:array_filter 函数的 $mode 参数在接收无效值时将抛出 ValueError

6 2026-06-23 16:34:00

PHP 中的 array_filter 函数利用回调函数对数组进行过滤。它支持一个可选的 $mode 参数,该参数接受一个整数值,用于指定应将数组的键、值,或两者同时传递给回调函数。

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

$mode 参数仅接受以下三个值:

  • 0(默认值):将数组值作为唯一的参数传递给 $callback
  • ARRAY_FILTER_USE_BOTH(赋值为 1):将数组值和键都传递给 $callback
  • ARRAY_FILTER_USE_KEY(赋值为 2):将数组键传递给 $callback

新增 ARRAY_FILTER_USE_VALUE 常量
鉴于 array_filter 函数的默认值(0)此前并未被定义为 PHP 常量,PHP 8.6 版本声明了一个名为 ARRAY_FILTER_USE_VALUE 的新全局常量。该常量被赋值为 0,这与 $mode 参数的默认值完全一致。

const ARRAY_FILTER_USE_VALUE = 0;

传入无法识别的 $mode 会抛出 ValueError

在 PHP 8.6 及更高版本中,如果传入除 ARRAY_FILTER_USE_VALUE (0)、ARRAY_FILTER_USE_BOTH (1) 或 ARRAY_FILTER_USE_KEY (2) 以外的值,将会抛出 ValueError 异常。

array_filter([], fn() => true, 3);
ValueError: array_filter(): Argument #3 ($mode) must be one of ARRAY_FILTER_USE_VALUE, ARRAY_FILTER_USE_KEY, or ARRAY_FILTER_USE_BOTH.

向后兼容性影响

在 PHP 8.6 之前的版本中,如果将无法识别的值传递给 array_filter 函数的 $mode 参数,该参数将被静默忽略,函数的行为如同 $mode = 0 一样。

在 PHP 8.6 及更高版本中,传递无效值会抛出 ValueError 异常。

ARRAY_FILTER_USE_VALUE 常量是新增的,但可以轻松地在旧版本的 PHP 上实现兼容:

if (!defined('ARRAY_FILTER_USE_VALUE')) {
    define('ARRAY_FILTER_USE_VALUE', 0);
}