刨根问底儿 -- intVal($str) 跟 (int) $str 的运算结果有什么区别

本文通过实验对比了PHP中intval函数与(int)类型强制转换两种方式将其他类型变量转化为int型的效果, 发现两者在普通十进制数字转换上结果相同。

intVal($str) 跟 (int) $str 都是把其他类型的变量转化为int型变量的方式,这么多年来我一直森森滴怀疑它们的运算结果在某些条件下会有区别。对于我的疑问,文档里也没有多说(或者我没找到),还是做个实验验证一下吧。

除了intVal函数的第二个参数可以指定$str字符串的进制形式外,对于普通的10进制数字型字符,这两种方式有什么样的区别呢?

小实验:

$arr = array(
        '$a' => 19,
        '$b' => 19.99,
        '$c' => '19.99',
        '$d' => '',
        '$d' => 'sfsdf',
        '$f' => '0x20',
        '$e' => array('19.99')
);

foreach ($arr as $k => $v){
    $v = intval($v);
    echo "intval({$v}) is :" , var_dump($v) , PHP_EOL;
}
echo '-----------------------', PHP_EOL;
foreach ($arr as $k => $v){
    $v = (int)($v);
    echo "intval({$v}) is :" , var_dump($v) , PHP_EOL;
}
die();


输出结果:

intval(19) is :int(19)

intval(19) is :int(19)

intval(19) is :int(19)

intval(0) is :int(0)

intval(0) is :int(0)

intval(1) is :int(1)

-----------------------
intval(19) is :int(19)

intval(19) is :int(19)

intval(19) is :int(19)

intval(0) is :int(0)

intval(0) is :int(0)

intval(1) is :int(1)

实验分析:输出的结果有两个值得注意的地方,第一,他们的结果完全一致;第二,非空会被转化为1,空会被转为0。

实验结论:

输出结果没啥区别,但intval()毕竟是要有函数调用的,所以相比较而言会慢那么一丢丢。


课外题:

$v = intval($v);

改成

$v = intval($v * 100);

试一下,会有什么惊喜?!



另外,举一反三,其他的类型转换方式会不会有相同的答案呢?试一下吧!


PHP中,`intval($answer)!=47` 用于判断 `$answer` 变量经过 `intval()` 函数处理后的值是否不等于 47。下面从几个方面来分析可能出现的相关问题及解释。 ### 数据类型问题 `intval()` 函数用于获取变量的整数值,它会根据变量的类型进行不同的处理。如果 `$answer` 是字符串,会按照特定规则转换为整数;如果是数组,会返回 1;如果是对象,会产生 `E_NOTICE` 错误并返回 1 [^1]。 ```php // 字符串情况 $answer = "abc"; var_dump(intval($answer)!=47); // 输出: bool(true),因为 intval("abc") 返回 0 // 数组情况 $answer = ["value"]; var_dump(intval($answer)!=47); // 输出: bool(true),因为 intval(数组) 返回 1 // 对象情况 $answer = new stdClass(); var_dump(intval($answer)!=47); // 输出: bool(true),会产生 E_NOTICE 错误,intval(对象) 返回 1 ``` ### 字符串数字问题 如果 `$answer` 是包含数字的字符串,`intval()` 会从字符串开头提取数字,直到遇到非数字字符。 ```php $answer = "47abc"; var_dump(intval($answer)!=47); // 输出: bool(false),因为 intval("47abc") 返回 47 $answer = "abc47"; var_dump(intval($answer)!=47); // 输出: bool(true),因为 intval("abc47") 返回 0 ``` ### 科学计数法问题 如果 `$answer` 是科学计数法表示的字符串,`intval()` 会将其转换为整数。 ```php $answer = "1e9"; var_dump(intval($answer)!=47); // 输出: bool(true),因为 intval("1e9") 返回 1000000000 ``` ### 进制问题 `intval()` 函数可以指定进制进行转换,默认是十进制。如果指定了其他进制,结果会不同。 ```php $answer = "FF"; var_dump(intval($answer, 16)!=47); // 输出: bool(true),因为 intval("FF", 16) 返回 255 ``` ### 语法正确性问题 `intval($answer)!=47` 本身语法是正确的,但要确保 `$answer` 变量已经正确定义。如果 `$answer` 未定义,会产生 `E_NOTICE` 错误,但不会影响 `intval()` 函数的执行,`intval()` 会将未定义的变量视为 0。 ```php // 未定义 $answer 变量 var_dump(intval($answer)!=47); // 输出: bool(true),同时会产生 E_NOTICE 错误,intval(未定义变量) 返回 0 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值