PHP 8.2中如何判断array_filter是否实际过滤了数组?
更优的PHP数组过滤判断实现方式
你原来的写法不仅繁琐,还存在潜在问题:array_diff 无法正确处理多维/关联数组的比较(它会将数组元素转为字符串后对比),可能导致判断结果出错。这里提供几种更高效、更可靠的实现方式:
方式一:一次遍历同时获取结果与过滤状态
如果需要同时保留过滤后的数组和判断是否有元素被过滤,这种方式只需要遍历一次数组,性能最优:
$array = [...]; $filteredArray = []; $hasBeenFiltered = false; foreach ($array as $item) { if (in_array($item['Type'], ['A', 'CNAME'])) { $filteredArray[] = $item; } else { // 只要有一个元素不符合条件,标记为已过滤 $hasBeenFiltered = true; } }
方式二:仅判断是否存在需过滤的元素(无需保留过滤数组)
如果不需要过滤后的数组,只是要确认是否有元素被过滤,可以直接检查原数组中是否存在不符合条件的元素:
$array = [...]; // 检查是否有元素的Type不在目标列表中 $hasBeenFiltered = array_reduce($array, function ($carry, $item) { return $carry || !in_array($item['Type'], ['A', 'CNAME']); }, false);
或者用PHP 7.4+支持的箭头函数简化写法:
$hasBeenFiltered = array_reduce($array, fn($carry, $item) => $carry || !in_array($item['Type'], ['A', 'CNAME']), false);
方式三:结合过滤与长度对比
如果已经用array_filter得到了过滤后的数组,直接对比原数组和过滤后数组的长度是更简洁的做法,还能避免array_diff的多维数组问题:
$array = [...]; $filteredArray = array_filter($array, fn($item) => in_array($item['Type'], ['A', 'CNAME'])); $hasBeenFiltered = count($array) !== count($filteredArray);
这种方式需要遍历两次数组(一次过滤,一次计数),性能略逊于方式一,但代码足够简洁。
内容的提问来源于stack exchange,提问作者Josh Bolton
相关产品推荐
相关产品推荐

