用array_map('intval', $arr)最稳妥,不修改原数组、语义清晰、兼容空值和字符串数字;避免settype()和裸(int)强转,注意键类型及非法输入处理。

PHP数组元素批量转int用array_map()最稳
直接用 array_map('intval', $arr) 是最常用也最不容易出错的方式。它不修改原数组,返回新数组,语义清晰,且对空值、字符串数字、浮点数都能合理处理。
常见错误是误用 settype() 或循环里写 $arr[$i] = (int)$arr[$i] —— 前者会把整个数组变成 int(值为1),后者在键非数字或稀疏时容易漏项或报错。
-
intval()对"12.9"返回12,对"abc"返回0,行为可预期 - 如果要严格拒绝非法输入(比如把
"abc"当作错误而非转成0),得配合filter_var($val, FILTER_VALIDATE_INT)判断 - 避免用
(int)强转字符串"0xff"这类十六进制——它会变成0,而intval("0xff", 16)才得255
循环中逐个转int要注意键类型和空值
真要用 foreach 或 for 循环,核心问题是:键是否连续?值是否可能为 null、false 或对象?这些都会让 (int) 转换结果失真。
比如 false 和 "" 都转成 0,但业务上可能需要区分;null 也会变 0,而你可能想保留 null 或抛异常。
立即学习“PHP免费学习笔记(深入)”;
- 用
foreach ($arr as $k => $v) { $newArr[$k] = is_numeric($v) ? (int)$v : 0; }比裸转更安全 - 如果原数组有字符串键(如
['a' => '1', 'b' => '2']),别用for ($i=0; $i<count> —— 它只适用于数字索引且连续的数组</count> - 遇到
NULL或对象,(int)会静默转成0,调试时很难发现逻辑偏差
filter_var_array()适合带校验的整型转换
当你要确保每个值都合法且是整数(比如接收表单参数后做类型清洗),filter_var_array() 比手动循环更可靠,它内置过滤规则,失败时可统一设默认值或留 FALSE。
它不自动“修复”非法值,而是明确告诉你哪个位置不合格,这对接口参数校验很关键。
- 写法示例:
filter_var_array($arr, array_fill_keys(array_keys($arr), FILTER_VALIDATE_INT)) - 结果中非法项是
FALSE,不是0,能立刻识别问题数据 - 性能略低于
array_map('intval'),但换来的是确定性——尤其在用户输入场景下值得 - 注意:
FILTER_VALIDATE_INT不接受带小数点的字符串("12.0"也不行),如需宽松,得先floatval再取整
别忽略浮点数精度和大整数截断风险
PHP 的 (int) 和 intval() 在处理大数值或浮点数时,可能因底层 double 表示导致意外截断。比如 intval(9999999999999999) 在 32 位系统上可能返回 10000000000000000。
这不是 bug,是浮点精度限制。如果你处理的是订单号、ID 等不允许出错的整数字符串,必须绕过浮点中间态。
- 对纯数字字符串(如
"123456789012345"),用filter_var($str, FILTER_VALIDATE_INT)或正则/^\d+$/先校验,再intval($str, 10) - 避免
(int)"123.9"这种写法——它先转 float 再转 int,小数部分丢失且无提示 - 64 位系统上最大安全整数约是
9223372036854775807,超了就得用GMP或字符串运算库











