Menu

PHP 类型转换:字符串转 int、intval() 和 (int)

用 (int) $str 或 intval($str) 把 PHP 字符串转成整数:(int) "42" 是 42,(int) "12abc" 是 12。学习转换为 int、float、bool、string 和 array,数字字符串,带进制的 intval,settype,以及如何校验输入,避免悄悄得到 0。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

要把一个值转换成另一种类型,在它前面用括号写上类型:(int) "42" 得到整数 42。函数形式 intval("42") 效果相同。类型转换永远不会失败:不是数字的文本会变成 0,以数字开头的字符串只保留开头的这些数字。

PHP 的类型转换有 (int)、(float)、(string)、(bool)、(array) 和 (object)。每种也都有对应的函数:intval()、floatval()、strval()、boolval()。

字符串转 int:(int) 和 intval() 返回什么

PHP 会跳过开头的空白,从字符串开头读取数字,遇到第一个不能构成数字的字符就停下。指数写法算作数字,0x 前缀不算。

注意 "12.7" 变成了 12:转换为 int 会直接截掉小数部分,而不是四舍五入。无论输入是什么,(int) 和 intval() 在这里都不会输出警告。

带进制的 intval()

intval($value, $base) 按另一种进制读取字符串。进制为 0 时,PHP 会看前缀:0x 表示十六进制,0b 表示二进制,开头的 0 表示八进制。下面的每个结果都可以用进制转换器核对。

float 转 int:截断,而不是四舍五入

(int) 会向零方向丢掉小数点后的所有内容。想得到最接近的整数,就先取整,并注意括号的位置:

最后两行是经典的浮点数陷阱:(0.1 + 0.7) * 10 实际存储为 7.999999...,截断后得到 7,先四舍五入则得到 8。数学函数页面介绍了 round、floor 和 ceil。

转换为 bool、string 和 array

转换为 bool 时,只有少数几个值会变成 false:0、0.0、""、"0"、null 和 []。其他值都是 true,包括 "0.0"、" " 和 "false"。

转换为 string 时,true 变成 "1",而 false 和 null 都变成 ""。浮点数会去掉末尾的 .0,非常大或非常小的浮点数会使用指数写法。

把数组转换成字符串并不会把元素拼接起来。下面的代码输出 Tags: Array:

<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;

PHP 还会加上一条警告:

Warning: Array to string conversion in /home/index.php on line 3

要把数组变成文本,用 implode(", ", $array) 或 json_encode($array)。

各种转换一览

选择一个值,看看 intval、(bool)、strval、is_numeric 和 gettype 对它分别返回什么。每个单元格都由 PHP 8.3 实际计算得出。

每个 $x 值的 intval、(bool)、strval 和 is_numeric
Point at or tap a cell to read it as PHP.
$xintvalboolstrvalis_numericgettype
"10"
"1abc"
"abc"
""
" "
"0"
"0.0"
"1e1"
"010"
1.5
true
false
null
[]
[1, 2]
Every cell computed by PHP 8.3.19.

数字字符串和自动转换

数字字符串就是看起来像数字的字符串:"12"、"-3.5"、"1e3",前后可以带空白。PHP 在算术运算中会自动转换它们,is_numeric() 可以告诉你一个字符串是否符合条件。

"12abc" + 1 仍然得到 13,但 PHP 8 会输出 Warning: A non-numeric value encountered,而 "abc" + 1 会抛出 TypeError。对用户输入做算术运算之前,先转换或校验。

settype() 和 gettype()

settype() 直接修改变量本身的类型,gettype() 返回变量的类型。get_debug_type() 返回更短的名称,也就是你在错误信息里看到的那种(int、float、string)。

大多数代码改用类型转换($value = (int) $value;),因为它更短,意思也一样。

校验输入,而不是直接转换

(int) 从不拒绝,所以 (int) "abc" 会悄悄变成 0,(int) "5 apples" 会变成 5。处理表单输入时,用带 FILTER_VALIDATE_INT 的 filter_var:它返回整数或 false。

用 === false 比较结果,因为 0 是合法的整数,用 == false 会把它也拒绝掉。filter_var 页面介绍了取值范围和其他校验器。

常见问题

PHP 中怎么把字符串转成 int?

用 (int) $str 或 intval($str),在十进制下两者结果相同。(int) "42" 是 42,(int) "12abc" 是 12,(int) "abc" 是 0。如果要拒绝不是整数的输入,用 filter_var($str, FILTER_VALIDATE_INT),它会返回 false,而不是去猜。

PHP 中 intval() 和 (int) 有什么区别?

在十进制下两者返回相同的结果。intval() 还可以传入进制:intval('ff', 16) 是 255;进制为 0 时,它会识别 0x、0b 这样的前缀,以及表示八进制的开头 0。intval 是函数,所以还能作为回调传入,例如 array_map('intval', $values)。

PHP 中 (bool) "0" 返回什么?

false。字符串 "0" 是 PHP 的假值之一,其他假值还有 ""、0、0.0、null 和 []。其余所有字符串都是 true,包括 "0.0"、" " 和 "false"。

PHP 中怎么把数字转成字符串?

用 (string) $n、strval($n),或者直接放进字符串:"$n"。(string) 3.0 是 "3";如果要固定小数位数,用 number_format($n, 2) 或 sprintf('%.2f', $n)。

Coddy 编程语言插图

和 Coddy 一起学编程

开始