博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[php] in_array 判断问题(坑)
阅读量:5019 次
发布时间:2019-06-12

本文共 1561 字,大约阅读时间需要 5 分钟。

 

执行以上代码,0和字符串是可以匹配成功的。

原因是在in_array,如果比较的类型不匹配,并且第一个参数是0,它会返回true(不正确)。

查手册:If the third parameter strict is set to TRUE then the in_array() function will also check the of theneedle in thehaystack.  

加上类型比较后返回false(正确)

经查阅相关资料如下:

1.情况一

$test = 'a';$array = array('a', 'b', 'c');if (in_array($test, $array)) {echo 'in array';} else {    echo 'no';}//output: in array

2.情况二

$test = 'other value';$array = array('a', 'b', 'c');if (in_array($test, $array)) {echo 'in array';} else {    echo 'no';}//output: no

  

------------------------ 看似一切都正常的分割线 -----------------------

3.情况三

$test = 0;$array = array('a', 'b', 'c');if (in_array($test, $array)) {    echo 'in array';} else {    echo 'no';}//output: in array

难以置信,这不坑爹吗,0不在列表中,但是这个函数返回true。这个函数很常用,所以当某些巧合出现后,就会导致不可预料的错误。

一开始我猜测in_array函数除了在values中寻找,还会去寻找keys,后来发现不是这样的。

4.情况四

$test = '0';$array = array('a', 'b', 'c');if (in_array($test, $array)) {    echo 'in array';} else {    echo 'no';}//output: no

是不是很有意思

5.原来是因为:

var_dump(0 == "a"); // 0 == 0 -> truevar_dump("1" == "01"); // 1 == 1 -> truevar_dump("10" == "1e1"); // 10 == 10 -> truevar_dump(100 == "1e2"); // 100 == 100 -> true

php比较数字和字符串时,会尝试将字符串转换为数字再进行比较。 例子中的 'a', 'b', 'c' 转成数字都是0,所以和0相等,in_array就返回了true。

6.如何避免

PHP的类型戏法是把双刃剑,有时候很爽,有时候很贱。

所以当in_array的needle与array中的值类型是否相同还不确定时,最好设置in_array函数的第三个参数 strict = true,这样在检查的时候会检查类型,数字与字符串就不会偷偷相等,也就避免类似这种问题。

$test = 0;$array = array('a', 'b', 'c');if (in_array($test, $array, true)) {    echo 'in array';} else {    echo 'no';}//output: no

  

原文链接:

转载于:https://www.cnblogs.com/Terry-Wu/p/7389768.html

你可能感兴趣的文章
Frameset 两页面互调控件技术案例
查看>>
ruby 构建API接口流程代码
查看>>
ASP.NET没有魔法——第一个ASP.NET应用《MyBlog》
查看>>
java web 插件式开发
查看>>
软件工程周总结12
查看>>
DDL对表的操作
查看>>
flutter key
查看>>
iOS 开发常见函数
查看>>
Android: NDK编程入门笔记
查看>>
深刻理解Linux进程间通信(IPC)
查看>>
windows 7中添加新硬件的两种方法(本地回环网卡)
查看>>
javascript 高级程序设计学习笔记(面向对象的程序设计) 2
查看>>
支配集,点覆盖集,点独立集之间的联系
查看>>
SetCapture ReleaseCapture
查看>>
DataGridView ——管理员对用户的那点操作
查看>>
POJ - 1185 炮兵阵地 (状态压缩)
查看>>
ios7 JavaScriptCore.framework
查看>>
算法6-5:哈希表应用之集合
查看>>
压力单位MPa、Psi和bar之间换算公式
查看>>
Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
查看>>