在日常 PHP 开发中,数组的过滤是一个非常常见的任务。无论是清理无效数据、去除特定元素,还是进行业务逻辑过滤,我们都可能会使用 array_filter() 或 array_diff() 等函数。单独使用它们已经很强大了,但当它们联合起来时,我们可以实现更复杂、更灵活的数组操作。
本文将通过示例,讲解如何结合 array_diff() 与 array_filter() 来实现复杂的数组过滤逻辑。
array_filter() 通常用于根据回调函数过滤数组中不符合条件的值:
$numbers = [1, 2, 3, 4, 5];
$even = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
// $even = [1 => 2, 3 => 4]
array_diff() 用于返回一个数组中所有不在其他数组中的值:
$all = ['apple', 'banana', 'cherry'];
$remove = ['banana'];
$result = array_diff($all, $remove);
// $result = [0 => 'apple', 2 => 'cherry']
假设你有一个包含多个用户输入的数据数组,其中包含了一些你想要排除的值(比如黑名单、已存在项、无效数据等)。你希望:
使用 array_filter() 来过滤掉无效或格式不正确的项;
然后使用 array_diff() 移除那些在黑名单中的值;
最终得到一个干净、可用于进一步处理的数组。
假设我们收集了一批用户提交的网址,我们需要:
去除空值或格式错误的网址;
排除在黑名单中的域名。
$userUrls = [
'https://m66.net/article/123',
'http://example.com/test',
'',
'not_a_url',
'https://m66.net/login',
'https://blacklist.com/malicious',
];
$blacklistedDomains = ['blacklist.com'];
// 第一步:使用 array_filter() 清除无效 URL
$validUrls = array_filter($userUrls, function($url) {
return filter_var($url, FILTER_VALIDATE_URL);
});
// 第二步:提取出合法 URL 的域名,并筛除黑名单域名
$filteredUrls = array_filter($validUrls, function($url) use ($blacklistedDomains) {
$host = parse_url($url, PHP_URL_HOST);
return !in_array($host, $blacklistedDomains);
});
// $filteredUrls 现在包含合法且不在黑名单中的 URL
print_r($filteredUrls);
Array
(
[0] => https://m66.net/article/123
[1] => http://example.com/test
[4] => https://m66.net/login
)
注意,这里我们实际上是使用了两次 array_filter(),也可以根据需要将 array_diff() 引入,用于处理域名列表之间的差异,如下所示:
我们可以先从 URL 中提取出所有的域名,然后通过 array_diff() 来排除黑名单域名:
$domains = array_map(function($url) {
return parse_url($url, PHP_URL_HOST);
}, $validUrls);
$allowedDomains = array_diff($domains, $blacklistedDomains);
// 再次筛选 URL,只保留属于 allowedDomains 的
$finalUrls = array_filter($validUrls, function($url) use ($allowedDomains) {
$host = parse_url($url, PHP_URL_HOST);
return in_array($host, $allowedDomains);
});
print_r($finalUrls);
通过结合 array_filter() 与 array_diff(),我们可以非常灵活地处理各种复杂数组过滤逻辑。在实际开发中:
array_filter() 更适合根据条件逐个检查数组元素;
array_diff() 更适合排除已知的无效项或黑名单;
两者结合,既可以进行元素内容校验,又可以实现集合差集过滤。
灵活掌握这些函数的组合技巧,将显著提升你在 PHP 中处理数据数组的效率和代码可读性。