当前位置: 首页> 最新文章列表> 使用 array_filter() 时忽略了键名的保留

使用 array_filter() 时忽略了键名的保留

M66 2025-05-17

在 PHP 中,array_filter() 函数是一个常见的数组处理工具,它用于过滤数组中的元素。array_filter() 函数接受一个回调函数和一个数组作为参数,返回一个新数组,其中包含所有满足回调函数条件的元素。

默认情况下,array_filter() 会保留过滤后数组的键名(下标)。不过,很多开发者在使用时可能会发现,键名没有被保留,或者会发生一些意料之外的情况。那么,为什么会出现这种现象呢?

1. array_filter() 的行为

array_filter() 的基本功能是根据回调函数的返回值来决定哪些元素被保留。回调函数返回 true 的元素会被保留下来,而返回 false 的元素会被移除。它的语法如下:

array_filter(array $array, callable $callback = null, int $mode = 0): array
  • $array:待过滤的数组。

  • $callback:用于过滤的回调函数。如果省略,默认会保留所有不为空的值。

  • $mode:一个可选的参数,可以控制数组的索引方式,通常为 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH

2. 默认情况下,array_filter() 会保留键名

当我们调用 array_filter() 时,它会保留数组元素的原始键名。例如,考虑以下示例:

$input = [0 => 'apple', 1 => 'orange', 2 => 'banana'];
$result = array_filter($input, function($value) {
    return strlen($value) > 5;
});

print_r($result);

输出将是:

Array
(
    [1] => orange
    [2] => banana
)

可以看到,原始键名(1 和 2)被保留了下来。

3. array_filter() 忽略键名的情况

但在某些情况下,如果你发现 array_filter() 没有保留键名,通常是因为在调用时使用了 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH 模式,或者回调函数返回了不同的值。

让我们来看看这个例子:

$input = [0 => 'apple', 1 => 'orange', 2 => 'banana'];
$result = array_filter($input, function($key) {
    return $key > 0;
}, ARRAY_FILTER_USE_KEY);

print_r($result);

这段代码会输出:

Array
(
    [1] => orange
    [2] => banana
)

虽然这里我们使用了 ARRAY_FILTER_USE_KEY 模式,但键名仍然得到了保留,因为我们过滤的是键值而非实际元素的值。

4. 为什么 array_filter() 会忽略键名的保留?

array_filter() 默认只过滤数组的值,而不会更改数组的键。如果你使用 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH,键名有可能会被重新计算或重置。这是由于 PHP 的内部处理逻辑所致,特别是在使用不同的过滤模式时,返回值可能会影响键名的保留。

5. 解决方案:重建索引

如果你希望过滤后的数组重新生成连续的键名,可以使用 array_values() 来重建索引:

$input = [0 => 'apple', 1 => 'orange', 2 => 'banana'];
$result = array_filter($input, function($value) {
    return strlen($value) > 5;
});
$result = array_values($result);

print_r($result);

输出:

Array
(
    [0] => orange
    [1] => banana
)

如你所见,使用 array_values() 后,数组键被重新索引,得到了从 0 开始的连续键名。

6. 总结

array_filter() 在默认情况下保留键名,但在特定模式下可能会发生键名丢失的现象,特别是使用 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH 时。如果你需要重置键名,可以通过 array_values() 来解决。

希望这篇文章对你理解 array_filter() 的行为有所帮助!