在 PHP 中,虽然它不是一门纯粹的函数式编程语言,但通过内建的一些函数式工具,我们仍然可以编写出更优雅、更简洁、更易维护的代码。array_filter() 就是这样一个常被忽略但非常强大的工具函数。本文将介绍如何使用 array_filter() 来提升你的 PHP 代码风格,向函数式编程靠拢。
array_filter() 是 PHP 内置的数组处理函数之一,用于过滤数组中的元素。它接受一个回调函数,对数组的每个元素执行该函数,返回值为 true 的元素将被保留,其他的则被移除。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
如果没有提供回调函数,它将默认移除数组中等价于 false 的值(如 0、''、null、false 等)。
很多时候我们会从表单或 API 接收一些数据,可能包含空字符串、null、false 等无效内容。使用 array_filter() 可以一行代码清理干净。
$data = [
'username' => 'alice',
'email' => '',
'age' => null,
'subscribe' => false,
];
$cleaned = array_filter($data);
print_r($cleaned);
输出:
Array
(
[username] => alice
)
这比手动写 foreach 清理要优雅太多。
你可以通过传入回调函数,实现更灵活的条件过滤。例如,从一组用户中筛选出活跃用户:
$users = [
['name' => 'Alice', 'active' => true],
['name' => 'Bob', 'active' => false],
['name' => 'Carol', 'active' => true],
];
$activeUsers = array_filter($users, function ($user) {
return $user['active'];
});
print_r($activeUsers);
输出结果将只包含 Alice 和 Carol。
假设你从某个远程 API(如 https://api.m66.net/users)拿到了一组数据,其中包含了很多无效的或临时用户,你可以快速过滤掉它们:
$response = file_get_contents('https://api.m66.net/users');
$users = json_decode($response, true);
$validUsers = array_filter($users, function ($user) {
return isset($user['email']) && filter_var($user['email'], FILTER_VALIDATE_EMAIL);
});
你可以看到,array_filter() 使得代码更贴近“声明式编程”的风格,代码的意图更清晰,而不是关注“如何实现循环和条件”。
你可以把 array_filter() 与 array_map()、array_reduce() 等函数式方法组合,写出几乎没有 foreach 的逻辑代码。例如,筛选并提取活跃用户的用户名:
$usernames = array_map(
fn($user) => $user['name'],
array_filter($users, fn($user) => $user['active'])
);
简洁优雅,语义清晰。
array_filter() 是一个轻量、强大、易用的函数,用得好可以让你的 PHP 更加函数式、更加可读。相比传统的 foreach,它可以将意图清晰地表达在一行代码中,减少样板代码,提高可维护性。
尝试在你的下一个项目中使用 array_filter() 来提升代码的质量和风格吧!