PHP中如何过滤数组中的零?为何array_filter统计零数量结果异常?
问题原因分析
核心问题:array_filter的判断逻辑
array_filter的工作机制是保留回调函数返回「真值」的元素,而PHP里的假值包含0、''、false、null、[]等。
你的代码中,当判断$x == 0时,返回的是$x本身也就是0——这属于假值,所以符合条件的元素会被过滤掉,最终返回的数组是空的,count结果自然为0。
而当判断$x > 0时,返回的是$x(正数),属于真值,这些元素会被保留,数组里有5个元素,count结果就是5。
修复后的代码
只需要在回调里明确返回布尔判断结果即可:
$arr = [1,2,0,3,4,5,0]; $countzero = count( array_filter($arr, function($x){ return $x == 0; // 直接返回判断的布尔结果true/false }) ); echo $countzero; // 输出2
也可以用更简洁的箭头函数(PHP 7.4及以上版本支持):
$arr = [1,2,0,3,4,5,0]; $countzero = count(array_filter($arr, fn($x) => $x == 0)); echo $countzero;
另外还可以用array_count_values直接统计所有值的出现次数,效率更高:
$arr = [1,2,0,3,4,5,0]; $counts = array_count_values($arr); echo $counts[0] ?? 0; // 输出2,??处理0不存在的边界情况
内容的提问来源于stack exchange,提问作者Iwan Kurniawan
相关产品推荐
相关产品推荐

