面试题中有一条是关于in_array判断的,题目如下:

如何大家没有深入了解in_array的类型判断过程,而是根据经验来选择,肯定很多人也是是选择了D答案的,具体的原因我也是从牛人的博客里面得到答案的,如下:

摘录如下:

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.原来是因为:

http://www.php.net/manual/en/language.operators.comparison.php

var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true(本题的答案)
var_dump("10" == "1e1"); // 10 == 10 -> true
var_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

in_array 判断问题的疑惑解决。的更多相关文章

  1. php array 根据value获取key,in_array()判断是否在数组内实例

    php array 根据value获取key,in_array()判断是否在数组内实例 <?php header("Content-type: text/html; charset=u ...

  2. in_array 判断的一些见解

    我个人见解in_array的判断是== 并不是===  证明如下: $arr=(array_merge(range(1, 9),range('a', 'z'),range('A', 'Z')));$m ...

  3. 上传txt文件编码格式判断(文本乱码解决方法)

    说明 通过ajax或者浏览上传文本文件,上传时候c#处理时候因为文本格式的创建不同,在获取内容时候会出现中文乱码. 解决方法 通过上传的文件流,判断文件的编码格式,在使用对应的编码格式获取文本内容 # ...

  4. org.springframework.orm.hibernate3.LocalSessionFactoryBean的疑惑解决办法

    在项目中使用了SSH框架(Struts2 + Spring3+ Hibernate3),applicationContext中配置了sessionFactory <bean id="s ...

  5. 监听Activity进入后台(最小化),并根据时间判断是否超时,此解决办法可用于超时重登陆

    通过重写一个继承自Activity的基类中的onUserLeaveHint()方法,当用户按Home键等操作使程序进入后台时即开始计时,当用户使程序恢复为前台显示时执行onResume()方法,在其中 ...

  6. [php] in_array 判断问题(坑)

    <?php $arr = array("Linux"); if (in_array(0, $arr)) { echo "match"; } ?> 执 ...

  7. 关于ArrayList 中子方法 -- contains 疑惑解决

    写之前先看下 ArrayList 子函数 contains 的Api 怎么介绍: boolean contains(Object o)           如果此列表中包含指定的元素,则返回 true ...

  8. NC 单据保存时间过长,判断数据库锁表解决办法

    SELECT s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$session s WHERE l.object_id = o.o ...

  9. HttpUrlConnection get和post简单实现(疑惑解决)

    近期研究微信的公众平台开发.须要和微信的server进行数据读取,简单研究了下jdk自带的HttpUrlConnection类(URLConnection的子类),简单实现了一下微信的access_t ...

随机推荐

  1. C++引用(Reference)

    引用(Reference)是C++语言相对于C语言的又一个扩充,类似于指针,只是在声明的时候用&取代了*.引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化.引用的声明方 ...

  2. 通过例子学python(2.2)

    2.2 通用序列操作 #2.2 通用序列操作 #所有序列类型都可以进行的操作:索引indexing,分片sliceing,加adding,乘multiplying,成员资格, #计算序列长度,找出最大 ...

  3. C#在ASP.NET4.5框架下的首次网页应用

    运行效果预览: 先看实践应用要求: 1.编写一个函数,用于计算1!+2!+3!+4!+5!,在控制台或页面输出运行结果. 2.在控制台或页面输出九九乘法表. 3.输入10个以内的整数,输出该组整数的降 ...

  4. disconf实践(二)

    因为有些系统的配置文件会随着业务更改,如某些控制开关,当大批量集群时,按照上一篇文章的配置就不够啦,需要做到热加载. 研究了一下,还好,比较简单,只要替换上一篇文章第4步的配置文件(spring-di ...

  5. js判断是否为手机浏览器

    JS判断手机浏览器 判断原理: JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根 ...

  6. DataGridView 选中行 分类: DataGridView 2015-01-22 09:07 51人阅读 评论(0) 收藏

    说明: (1)命名 DataGridView 名称:dgvStockFirst 行索引:recordIndex (2)设置DataGridView属性: SelectionMode=FullRowSe ...

  7. winform Label与DataGridView右对齐 分类: WinForm 2014-05-19 20:51 446人阅读 评论(0) 收藏

    实现Label与DataGridView对齐有两种方法,差别不大: 定义: Label名称:lblName DataGridView名称:dgvData 第一种: lblName.Location = ...

  8. 推荐一个网站——聚合了微软的文件的Knowledge Base下载地址

    Microsoft Files是一个微软的文件数据库,从这里可以很方便的找到各个文件版本对应的下载链接. 比如今天debug需要找一个特定版本的sos.dll,从这个网站就很方便的给出了这个sos.d ...

  9. 1040. Longest Symmetric String (25)

    题目链接:http://www.patest.cn/contests/pat-a-practise/1040 题目: 1040. Longest Symmetric String (25) 时间限制 ...

  10. wdlinux 编译pdo_mysql

    由于项目需要用到pdo 链接数据库 wdlinux在centos6.4下 没有pdomysql模块 ,所以重新编译 有的系统无法使用pdo_mysql 1 重新编译mysql http://www.w ...