最直接的方法是用array_filter()配合$v > 0筛选正数,保留原键名;需重索引时加array_values();含非数字项时宜用foreach配合is_numeric()和(float)转换确保安全。
用
直接筛掉负数
PHP 里最直接的办法就是用
配合匿名函数,把小于 0 的元素过滤掉。它默认保留返回值为
的项,所以只要判断
就行。
注意:0 既不是正数也不是负数,
自然会把 0 和所有负数都剔除
如果想保留 0,得改成
原始数组键名默认保留(关联数组不会重索引),如需重排成数字索引,后面套一层
用
手动遍历更可控
当你要在筛选同时做类型检查、四舍五入、或跳过非数字项时,
更灵活。比如数组里混了字符串
或
,
默认不报错但可能隐式转成 0,导致误留。
加
判断可防类型干扰
用
强制转浮点,避免字符串如
被当成 true
手动
追加,天然获得连续数字键
遇到浮点数比较要小心精度问题
如果数组里有像
这类计算结果(实际是
),直接用
没问题,但若后续要做精确等于判断(比如筛出“刚好 0.3”),就得用
正负筛选本身不受影响,因为符号判断对浮点是安全的
但如果你写的是
这种逻辑,就可能漏掉本该保留的数
别用
直接比浮点数,这是通病,不是 PHP 特有
性能差异其实可以忽略
对几千以内元素的数组,
和
速度差别微乎其微。真要处理上万条,瓶颈通常在 I/O 或算法复杂度,而不是这个筛选动作本身。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
除非你在高频循环里反复调用(比如每秒上千次请求),否则不用提前优化
内部是 C 实现,理论上略快;但可读性和维护性更重要
别为了“看起来快”硬套函数式写法,尤其当逻辑变复杂后,
更容易加日志、断点或条件分支
实际项目里,90% 场景用
加
就够了;剩下那 10%,往往是因为数据脏——混了非数字、空字符串、对象,这时候手动遍历才是靠谱的选择。
array_filter()array_filter()true$v > 0$v > 0$v >= 0array_values()$arr = [-3, 0, 5, -1.5, 7, -0.2];
$positive = array_filter($arr, function($v) { return $v > 0; });
// 结果:[2 => 5, 4 => 7] —— 键名还在
$positive = array_values($positive); // 变成 [0 => 5, 1 => 7]
foreachforeach"abc"nullarray_filter()is_numeric($v)(float)$v > 0"-5"[]$arr = [-3, "abc", 5, null, "2.7", "-1"];
$result = [];
foreach ($arr as $v) {
if (is_numeric($v) && (float)$v > 0) {
$result[] = (float)$v;
}
}
// $result = [5.0, 2.7]
0.1 + 0.20.30000000000000004> 0abs($v - 0.3) 这类容差方式。round($v, 1) == 0.3==array_filter()foreacharray_filter()foreacharray_filter()array_values()