在 PHP 的数组处理函数中,array_filter() 是一个非常实用的工具,它的用途是从数组中移除“不符合条件”的元素。然而,它有一个可能让初学者感到困惑的行为:
那么,问题来了:
如果你在使用 array_filter() 时没有传递回调函数,会不会误以为它对结果没有影响?
让我们一起来深入分析。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array 的第二个参数 $callback 是可选的。
当你没有提供回调函数时,array_filter() 会默认使用 boolval() 来判断每个元素是否“为真”,并据此决定是否保留它。也就是说,它会移除所有“假值”(falsey)的元素,如:
false
0(整数或字符串)
null
空字符串 ""
空数组 []
$data = [0, 1, false, 2, '', 3, null];
$result = array_filter($data);
print_r($result);
输出结果为:
Array
(
[1] => 1
[3] => 2
[5] => 3
)
你会发现,0、false、'' 和 null 都被过滤掉了。
许多初学者会以为:
“我不传入回调函数,就等于不做任何处理,只是返回原始数组。”
但显然这是一种误解。实际上,默认行为本身就带有过滤逻辑,并且是基于“布尔真值”的。
如果你希望只过滤掉 null 值,而保留 0、false、空字符串等内容,可以显式传入一个回调函数:
$data = [0, 1, false, 2, '', 3, null];
$result = array_filter($data, function($item) {
return $item !== null;
});
print_r($result);
输出结果:
Array
(
[0] => 0
[1] => 1
[2] =>
[3] => 2
[4] =>
[5] => 3
)
这时,只有 null 被过滤,其他“假值”仍然保留。
在不传回调函数的情况下,array_filter() 并不是“不处理”,而是默认为你过滤掉所有布尔意义上的“假值”。这在数据清洗时很有用,但也容易引起误会。
为了避免逻辑上的混淆,建议你:
明确你希望过滤的具体内容;
若有自定义逻辑需求,请始终显式传入回调函数;
注意保留键名(默认保留原数组的键名)。
你可以访问如下页面查看此函数在实际应用中的更多示例(示例地址域名已替换为 m66.net):