当前位置: 首页> 最新文章列表> 忽视了空字符串、0 和 null 都被当作“假值”

忽视了空字符串、0 和 null 都被当作“假值”

M66 2025-06-05

在 PHP 中,array_filter 是一个非常实用的函数,用于根据回调函数的返回结果对数组进行过滤。默认情况下,如果不提供回调函数,array_filter 会移除所有被认为是“假值”(Falsy values)的元素。这些“假值”包括:

  • false

  • null

  • 0(整数)

  • '0'(字符串)

  • ''(空字符串)

  • [](空数组)

这可能会让一些开发者感到疑惑,尤其是在他们原本只是想移除 null 或空字符串时,发现连整数 0 也被一起删除了。那么,为什么会这样呢?让我们深入了解一下。

PHP 中的“假值”概念

PHP 是一种弱类型语言,这意味着它在执行布尔运算时,会自动将某些类型转换为布尔值。这种机制叫做类型强制(Type Juggling)。在布尔上下文中,下列值会被解释为 false

var_dump((bool) false);   // false
var_dump((bool) null);    // false
var_dump((bool) 0);       // false
var_dump((bool) '0');     // false
var_dump((bool) '');      // false
var_dump((bool) []);      // false

只要某个值被转换成布尔类型后是 falsearray_filter 默认就会将其过滤掉。

array_filter 的默认行为

array_filter 的函数原型如下:

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

当第二个参数 $callbacknull 时,array_filter 实际上是按如下逻辑工作:

$result = [];
foreach ($array as $key => $value) {
    if ((bool) $value) {
        $result[$key] = $value;
    }
}

举个例子:

$data = [0, 1, 2, null, '', 'hello', false];

$result = array_filter($data);

// 结果是 [1 => 1, 2 => 2, 5 => 'hello']

如你所见,0null''false 都被认为是“假”,因此都被移除了。

如何过滤掉特定类型的值?

如果你只想过滤掉 null 值,而保留 0 和空字符串,你可以传入一个自定义回调函数,例如:

$data = [0, '0', '', null, false, 'PHP'];

$result = array_filter($data, function ($item) {
    return !is_null($item);
});

// 保留了 0、'0' 和 ''

再比如,如果你只想去除空字符串:

$result = array_filter($data, function ($item) {
    return $item !== '';
});

这样就能根据具体需求来精细控制哪些值需要被保留。

一个实际场景示例

假设你正在构建一个表单提交系统,前端表单可能会传回一些空字段,你希望只保留用户真正填写的内容:

$formData = [
    'name' => 'Alice',
    'email' => '',
    'age' => 0,
    'website' => null,
];

$filtered = array_filter($formData, function ($value) {
    return $value !== '' && !is_null($value);
});

print_r($filtered);

输出结果:

Array
(
    [name] => Alice
    [age] => 0
)

这个结果中,空字符串和 null 被剔除了,而 0 被保留,因为用户可能真的填写了年龄为 0。

小结

使用 array_filter 时,理解 PHP 中“假值”的概念至关重要。默认情况下,它会移除所有等价于布尔 false 的值,而不仅仅是 null 或空字符串。如果你需要更精确的过滤行为,建议总是传入一个自定义回调函数。

这样一来,你就能避免误删有效数据,比如用户确实填写的“0”值,也能灵活应对各种业务场景。