在 PHP 中,array_filter() 函数是一个常见的数组处理工具,它用于过滤数组中的元素。array_filter() 函数接受一个回调函数和一个数组作为参数,返回一个新数组,其中包含所有满足回调函数条件的元素。
默认情况下,array_filter() 会保留过滤后数组的键名(下标)。不过,很多开发者在使用时可能会发现,键名没有被保留,或者会发生一些意料之外的情况。那么,为什么会出现这种现象呢?
array_filter() 的基本功能是根据回调函数的返回值来决定哪些元素被保留。回调函数返回 true 的元素会被保留下来,而返回 false 的元素会被移除。它的语法如下:
array_filter(array $array, callable $callback = null, int $mode = 0): array
$array:待过滤的数组。
$callback:用于过滤的回调函数。如果省略,默认会保留所有不为空的值。
$mode:一个可选的参数,可以控制数组的索引方式,通常为 ARRAY_FILTER_USE_KEY 或 ARRAY_FILTER_USE_BOTH。
当我们调用 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)被保留了下来。
但在某些情况下,如果你发现 array_filter() 没有保留键名,通常是因为在调用时使用了 ARRAY_FILTER_USE_KEY 或 ARRAY_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 模式,但键名仍然得到了保留,因为我们过滤的是键值而非实际元素的值。
array_filter() 默认只过滤数组的值,而不会更改数组的键。如果你使用 ARRAY_FILTER_USE_KEY 或 ARRAY_FILTER_USE_BOTH,键名有可能会被重新计算或重置。这是由于 PHP 的内部处理逻辑所致,特别是在使用不同的过滤模式时,返回值可能会影响键名的保留。
如果你希望过滤后的数组重新生成连续的键名,可以使用 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 开始的连续键名。
array_filter() 在默认情况下保留键名,但在特定模式下可能会发生键名丢失的现象,特别是使用 ARRAY_FILTER_USE_KEY 或 ARRAY_FILTER_USE_BOTH 时。如果你需要重置键名,可以通过 array_values() 来解决。
希望这篇文章对你理解 array_filter() 的行为有所帮助!