php数组不能直接强转为整型,否则非空数组恒得1、空数组得0;应按需选择方法:批量转元素用array_map,统计整数个数需综合判断类型与值,避免误用is_int。

php数组转整型:别直接强转,会丢数据
PHP里把整个数组用 (int) 或 intval() 强转,结果永远是 1(非空数组)或 0(空数组),这不是bug,是语言设计——数组不是标量,无法映射为单个整数。
真正需求通常是这几种:把数组每个元素转成整型、提取其中的整数并统计个数、把数字字符串组成的数组整体转为整型数组。必须先明确目标,再选方法。
- 如果想批量转换元素:用
array_map('intval', $arr),但注意intval("12.34") → 12,intval("abc") → 0 - 更安全的逐项转换:用
array_map(fn($x) => is_numeric($x) ? (int)$x : 0, $arr) - 绝对不要写
(int) $arr—— 它不报错,但返回值毫无意义,且掩盖逻辑问题
统计数组中整数个数:区分“整数值”和“整数类型”
PHP里 is_int($x) 只认真正的整型变量,而 "123"、123.0、true 都不算。但业务上你大概率想统计的是“能无损表示为整数的值”,比如字符串 "42" 或浮点 7.0。
所以得组合判断:
立即学习“PHP免费学习笔记(深入)”;
- 用
filter_var($x, FILTER_VALIDATE_INT) !== false判断是否为合法整数字符串(如"-5"✅,"3.14"❌," 42 "✅) - 对浮点数,先用
is_float($x) && floor($x) == $x判断是否为整数值 - 对布尔值,
true和false不算整数,即使(int)true === 1—— 这是类型语义问题,不是数值等价
简明统计函数示例:
function count_integers($arr) {
return array_reduce($arr, function($carry, $x) {
if (is_int($x)) return $carry + 1;
if (is_string($x) && filter_var($x, FILTER_VALIDATE_INT) !== false) return $carry + 1;
if (is_float($x) && $x == (int)$x && !is_infinite($x)) return $carry + 1;
return $carry;
}, 0);
}
array_filter + is_int 失效的常见原因
直接写 count(array_filter($arr, 'is_int')) 看似简洁,但实际几乎总出错:
- 数组里混着字符串数字(如
["1", "2", "three"]),is_int("1")是false,全被滤掉 - JSON解码后数字默认是浮点(即使原始是
123),is_int(123.0)仍是false - 从表单或URL接收的数据全是字符串,
$_GET['ids'] = ["1","2","3"]—— 此时is_int永远返回false
别迷信函数名,要看它实际校验的是类型,不是值的数学性质。
性能与边界:大数组别用 array_map + filter_var
filter_var($x, FILTER_VALIDATE_INT) 内部有字符串解析开销,对万级数组做全量遍历会明显变慢;而 is_numeric($x) && (int)$x == $x 更快,但有陷阱:
-
is_numeric("1e2")是true,但(int)"1e2" → 1,比较失败 → 漏判 -
is_numeric("0x1F")是true,但(int)不识别十六进制字符串 → 漏判 - 稳妥做法:小数组用
filter_var,大数组且确定输入格式简单(如纯十进制数字字符串),可用正则/^-?\d+$/配合is_string快速筛
真实项目里,输入来源决定校验策略——API参数建议用 filter_var 保语义准确,日志分析等内部数据可激进优化。
类型和值的界限在PHP里特别模糊,动手前先想清楚:你要的到底是“变量类型是int”,还是“这个值在数学上是个整数”。两者处理方式完全不同,混用就会反复踩坑。











