如果耐不住寂寞,你就看不到繁华 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

PHPer欢乐的踩坑-运算

开发 memory 发布于June 15, 2017 标签: PHP

做开发嘛,一个是要开心,一个是要顺手。
最近咧搞财务系统比较多,我们聊点好玩的。。。
运算、比较
哈哈...开坑

示例一:

$a = '1.11';
$b = '0.11';
var_dump($a);//string(4) "1.11" 
var_dump($b);//string(4) "0.11" 
$re = $a - $b;
var_dump($re);//float(1)

示例二:

$a = '11';
$b = '1';
var_dump($a);//string(4) "11" 
var_dump($b);//string(4) "1" 
$re = $a - $b;
var_dump($re);//int(10)

结论:
1.在PHP底层运算的过程中,会自动进行类型转换,小数的转换成float,整数转换成int。
2.需要对数字有小数点后几位限制的,记得处理一下。number_format();

示例三:

var_dump(0123 == 123);  
var_dump('0123' == 123);  
var_dump('0123' === 123);

一方面是0开的头整形数字PHP底层会认为是八进制;另一方面是sting转换成int时会把前边的0去掉
var_dump(0123 == 123);// false,PHP会默认把0123当作8进制来处理,实际转化为10进制就是83,显然这不是相等的。
var_dump('0123' == 123);// true这里php会非常有趣的将’0123’转换成一个数字而且默认去掉了前面的0也就是123==123
var_dump('0123' === 123);// false很显然上面的问题已经说过了数字和字符串类型不一致。
结论:

  1. 0开头的整形数字PHP会当作八进制来处理
  2. 字符串在运算时会自动做类型转换,而且会把前边的0去掉

示例四:

下面$x的结果是多少?

$x = NULL;
if ('0xFF' == 255) {
   $x = (int)'0xFF';
}
$x = ?

注意点:
首先'oxFF' == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff = 255。PHP使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。
但是$x = (int)'0xFF';是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0

结论:

  1. 0开头的整形数字PHP会当作十六进制来处理
  2. string->int的过程,是将字符串从左向右进行转换,遇到非数字字符则停止。

示例五:

经过下面的运算 $x的值应该是多少?

$x = 3 + "15%" + "$25"

参考示例四的结论2

示例六:

这个是考虑运算符优先级的...

$a = true && false;
var_dump($a);
$a = true and false;
var_dump($a);

示例七:

$arr = array(0,1,2,3);
foreach ($arr as $key => $value) {}
  var_dump(current($arr));//最后指针停留在数组结尾,取不到值了输出false

  $arr = array(0,1,2,3);
  foreach ($arr as $key => $value) { 
  //$arr其实是进行了一次传值,用的是$arr_copy 
        $arr[$key] = $value;//进行了改值,则发生分离现象
}
var_dump(current($arr));//输出1

输出false 与 1;(PHP5.6环境下,php7已经做了修改);
那这个又是为什么呢?【和PHP内核有关,变量分离改变】

current() 函数返回数组中的当前元素的值。
每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。
提示:该函数不会移动数组内部指针。要做到这一点,请使用 next() 和 prev() 函数。
相关的方法:
end() - 将内部指针指向数组中的最后一个元素,并输出
next() - 将内部指针指向数组中的下一个元素,并输出
prev() - 将内部指针指向数组中的上一个元素,并输出
reset() - 将内部指针指向数组中的第一个元素,并输出
each() - 返回当前元素的键名和键值,并将内部指针向前移动

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1325篇
  • 用户评论:697条
  • 开博至今:3999天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • tomxuetao: 能个实例吗?
  • memory: 哈哈哈。。。话说也没毛病。
  • 硫酸亚铁: 看了文章觉得自己已经是松鼠癌了 东西总是先占着 反正我有 什么...
  • xl: 支持一下
  • iHerb海淘攻略: 感谢分享
  • memory: POINT
  • sunyunlin: 数据库应该建些什么字段?
  • pengcheng: 已解决
  • pengcheng: Oops! It seems that sphinx was b...
  • 券都有: 感谢分享
  • memory: 这是我3年前玩过一次,当时因为安装完后,发现日常办公还好,但是好...
  • sdf: 想问一下,激活工具激活后,后面会出现提示要再次重新激活吗?
  • memory: 你要用碗装我吗?还是要我把扔的扔进你碗里???!!! &^_^&
  • 薛才杰: 同感,快扔到我的碗里来。。。
  • memory: 要说明一下,在大陆及香港的云主机或VPS,都是不支持的。原因都懂...
  • 历史趣谈LishiQtan: 很好的文章,值得收藏
  • memory: 现在回头看,,,这么烂的代码,也是醉了.