[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'"> ...
随机推荐
- php与HTML交互问题
1.将表单中的action属性值设为PHP路径,则网页会跳转到这个网址 <html> <body> <form action="welcome.php" ...
- MongoDB 基本操作学习笔记
// 查看所有数据库 show dbs // amdin 0.000GB // local 0.000GB // 使用数据库 use admin // switched to db admin // ...
- Java - 二叉树递归与非递归
树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...
- Oracle Rac创建表空间及用户
1. 创建表空间: BEGIN DECLARE cnt integer := 0; BEGIN SELECT 1 INTO cnt FROM dual WHERE exists(SELECT * FR ...
- spring jdbc踩坑日记,new JdbcTemplate 为null导致UserDao一直为null
private DataSource datasource; private JdbcTemplate jdbcTemplateObject; //设置注入 public void setdataso ...
- 突然觉得前端js挺不错的
由于工作的需要,现在对前端技术有一定的要求,但是发现普遍前端技术都比较弱,遇到问题基本上没有人能帮助你解决,只好自己学习了. 从事java开发已经好久了,真的是好久了,但是水平一直还是一般吧. 从今天 ...
- 为Ghost博客扩展代码高亮、数学公式、页面统计、评论
前几天捣鼓了一下博客首页,接下来再丰富一下博客页面的功能与内容.由于我所使用的Ghost博客专注于轻量简洁,因此标题中提到的功能在Ghost中默认均不支持.下面将逐个介绍一下如何为Ghost扩展这些功 ...
- cglib源码主流程源码-我们到底能走多远系列48
扯淡 祝各位在园里的朋友新年快乐! 辛苦一年,为更好的自己也为更好的世界,很多人要感谢你们,你们也应该有很多人要感谢吧. 看了马斯克的采访视频,又想起兰迪·鲍许的最后一课,时光迁移,唯有梦想可坚持. ...
- 【OCR技术系列之四】基于深度学习的文字识别(3755个汉字)
上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...
- POJ [P3020] Antenna Placement
二分图匹配求最小边覆盖 建图方法中的黑白染色法,题目中说信号可以覆盖相邻两个块,那么我们可以将给定的地图染成国际象棋棋盘的样子,一个黑格可以与周围的四个白格共用信号,对于城市,从每一个黑格出发,向其周 ...