[php] in_array 判断问题(坑)
<?php
$arr = array("Linux");
if (in_array(0, $arr)) {
echo "match";
}
?>
执行以上代码,0和字符串是可以匹配成功的。
原因是在in_array,如果比较的类型不匹配,并且第一个参数是0,它会返回true(不正确)。
查手册:If the third parameter strict is set to TRUE then the in_array() function will also check thetypes 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.原来是因为:
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
原文链接:http://blog.csdn.net/edwingu/article/details/8876981
[php] in_array 判断问题(坑)的更多相关文章
- in_array 判断问题的疑惑解决。
面试题中有一条是关于in_array判断的,题目如下: 如何大家没有深入了解in_array的类型判断过程,而是根据经验来选择,肯定很多人也是是选择了D答案的,具体的原因我也是从牛人的博客里面得到答案 ...
- php array 根据value获取key,in_array()判断是否在数组内实例
php array 根据value获取key,in_array()判断是否在数组内实例 <?php header("Content-type: text/html; charset=u ...
- in_array 判断的一些见解
我个人见解in_array的判断是== 并不是=== 证明如下: $arr=(array_merge(range(1, 9),range('a', 'z'),range('A', 'Z')));$m ...
- php中in_array函数的坑
由于PHP是弱类型语言,所以有自动类型转换 例子 $array = [0, 1, 2, '3']; var_dump(in_array('abc', $array)); //true var_dump ...
- 关于MyBatis传入String用于test判断的坑
不要在心情糟糕的时候写代码,能坑死自己. 今天码代码的时候出现一个问题,脾气暴躁到砸桌子, 在Mybatis传入参数为String并且用 if test 判断的过程中发现 <if test=&q ...
- php in_array 的一个坑
in_array('', [0]); // true 因为 php 里面 '' == 0 的结果是 true,这种情况即使 in_array 第三个参数传了 true,还是不能达到想要的效果,只能特殊 ...
- MySQL中的case when 中对于NULL值判断的坑
sql中的case when 有点类似于Java中的switch语句,比较灵活,但是在Mysql中对于Null的处理有点特殊 Mysql中case when语法: 语法1: CASE case_val ...
- Java中关于Integer, String 类型变量 == 与 equals 判断的坑
== 与 equals()的联系: ==: 我们都知道Java中 == 对用于基础数据类型(byte, short, int, long, float, double, boolean, char)判 ...
- 【mybatis】IF判断的坑
http://cheng-xinwei.iteye.com/blog/2008200 最近在项目使用mybatis中碰到个问题 <if test="type=='y'"> ...
随机推荐
- java注解--Annotation
Annotation(注释) 概述 从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注释) Annotation 其实就是代码里的特殊 ...
- SQL Server ——动态SQL
EXECUTE 执行 Transact-SQL 批中的命令字符串.字符串或执行下列模块之一:系统存储过程.用户定义存储过程.标量值用户定义函数或扩展存储过程.SQL Server 2005 扩展了 E ...
- 壮美大山包-2017中国大山包国际超百公里ITRA积分赛赛记
2017年4月份用时28个多小时跑完江南100,付出的代价是双脚多达8个以上的水泡.所以接下来的4月29日的环汶川越野赛果断的从60公里换到了30公里组,慢悠悠的完成了. 虽然在赛道上一度想再也不参加 ...
- CSS样式中常用的字体名称
css中引入字体: @font-face { font-family: "AncientWar"; src: url('style/css/fonts/AncientWar.ttf ...
- grep的小技巧
grep '^[^#]' /etc/openvpn/server.conf 中括号必须匹配一个字符^$属于标志位,不属于字符 grep没把\n看成字符 grep把空行看成^$ 还是perl的标准,空行 ...
- 【转】sed 的参数
一.15个参数 1.r 从文件读入 [root@watchout2 ~]# cat file12345 [root@watchout2 ~]# cat newfile abcde [root@watc ...
- 查询操作 -- Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- R语言-图形初阶
在本节中,主要目的是如何使用R语言做出简单的图形 案例1:做出wt和mpg之间的关系 attach(mtcars) plot(wt,mpg) abline(lm(mpg~wt)) title('Reg ...
- 深入理解JAVA虚拟机之JVM性能篇---垃圾回收
一.基本垃圾回收算法 1. 判断对象是否需要回收的方法(如何判断垃圾): 1) 引用计数(Reference Counting) 对象增加一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...
- Xposed 初尝
1.初次使用xposed,之前直至其名,不闻其用. 2.相关引用配置上图 build.gradle配置,如下: dependencies { compile fileTree(include: ['* ...