在 PHP 开发中,数组操作是日常工作中最常见的一环。而“清洗数组”这件事,我们几乎天天都在做。无论是处理用户提交的表单数据,还是清理接口返回的数据,其中最常见的需求之一就是。
幸运的是,PHP 提供了一个非常优雅的方法:array_filter()。本文将带你深入了解这个函数的用法,并分享一些实用技巧,帮你高效、灵活地过滤数组中的空元素。
PHP 的 array_filter() 默认行为就是移除数组中值为“false”的元素,包括:
空字符串 ''
数字 0 和字符串 '0'
null
false
空数组 []
来看一个最简单的例子:
$data = ['apple', '', null, 'banana', 0, '0', false];
$filtered = array_filter($data);
print_r($filtered);
输出结果为:
Array
(
[0] => apple
[3] => banana
)
你会发现,array_filter() 默认就把那些“看上去没内容”的值都去掉了。这种用法对于大多数场景已经足够好。
如果你不希望 '0' 或 0 被过滤掉,那就可以自定义一个回调函数,让 array_filter() 只过滤掉你真正认为是“空”的值,比如 null 或 ''。
$data = ['title' => '', 'price' => 0, 'available' => false, 'sku' => '0', 'description' => null];
$filtered = array_filter($data, function($value) {
return !is_null($value) && $value !== '';
});
print_r($filtered);
输出:
Array
(
[price] => 0
[available] =>
[sku] => 0
)
这种方式特别适合处理用户表单数据或配置项,不会误删有意义的“零值”。
假设你要将用户输入的数据通过 POST 请求发送给某个 API,我们不希望把空值传过去:
$formData = [
'name' => '张三',
'email' => '',
'phone' => null,
'age' => 25
];
$cleanData = array_filter($formData, function($val) {
return !is_null($val) && $val !== '';
});
$apiUrl = 'https://api.m66.net/user/submit';
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($cleanData),
]
];
$context = stream_context_create($options);
$result = file_get_contents($apiUrl, false, $context);
echo $result;
通过这种方式,我们只发送有效数据,避免让 API 收到一堆没用的字段。
如果你的数组是多维的,比如从前端提交的嵌套表单,那就需要用递归的方式去清理:
function recursive_filter(array $input) {
foreach ($input as $key => &$value) {
if (is_array($value)) {
$value = recursive_filter($value);
}
}
return array_filter($input, function($val) {
return $val !== '' && !is_null($val);
});
}
$data = [
'user' => [
'name' => '李四',
'email' => '',
'tags' => ['', null, 'developer']
],
'status' => null
];
$cleaned = recursive_filter($data);
print_r($cleaned);
这样处理后,你的数组干干净净,既不会漏删空值,也不会错删有效内容。
通过上面的案例,我们可以看到:
array_filter() 默认行为已经很强大,快速去掉各种“假值”。
搭配自定义回调,你可以精确控制要过滤的内容。
处理复杂结构时,用递归方式也能轻松应对。
实际开发中,它可以用于清理表单数据、接口请求参数、甚至数据库写入前的数据过滤。
总之,这个函数用得越熟练,你的数据就越干净,代码也会更优雅!