为什么in_array(0, ['a', 'b', 'c'])返回true

目录

  • 1 类型转换
  • 2 严格比较
  • 3 false和null
  • 4 数组中有true

在PHP中,数据会自动转换类型后进行比较。

所以会发现一个奇怪的现象,就是:

in_array(0, ['a', 'b', 'c'])      // 返回bool(true),也就相当于数组中有0
array_search(0, ['a', 'b', 'c']) // 返回int(0),也就是第一个值的下标
0 == 'abc' // 返回bool(true),也就相当于相等

这两个表达式都返回true

直观上看,0没有在数组['a', 'b', 'c']中,也不会等于abc这个字符串。

那怎么会返回true呢?

1 类型转换

原因就在于,比较时的PHP做了类型转换。

PHP官网上的说明:http://php.net/manual/en/language.types.string.php#language.types.string.conversion

也就是在比较前,string类型的数据会转换成int型,然后再比较。

而如果string类型数据第一个字符不是数字,就会转换成0。例如,

echo intval("Bye");    // 输出0

因为in_array()array_search()默认都是松散比较,相当于==,所以就得到true

2 严格比较

那如何得到false呢?

就是用严格比较,如下,

in_array(0, ['a', 'b', 'c'], true)        // 返回false
array_search(0, ['a', 'b', 'c'], true) // 返回false
0 === 'abc' // 返回false

强制做类型比较,这样就能拿到精确的结果。

3 false和null

那么,如果用falsenull与字符串数组比较会如何呢?

它们是不会转换成int型的,所以结果是这样的:

in_array(null, ['a', 'b', 'c'])  //返回false
in_array(false, ['a', 'b', 'c']) //返回false

4 数组中有true

还有另外一个看起来比较奇怪的现象:

in_array('a', [true, 'b', 'c'])       // 返回bool(true),相当于数组里面有字符'a'
array_search('a', [true, 'b', 'c']) // 返回int(0),相当于找到了字符'a'

这是为什么呢?

说起来也很好理解,松散比较下,任何string都等于true

要想不相等,用严格比较。

参考资料:

  1. Php, in_array, 0 value
  2. PHP in_array() / array_search() odd behaviour
  3. String conversion to numbers

为什么in_array(0, ['a', 'b', 'c'])返回true的更多相关文章

  1. PDOstament对象执行execute()函数,只要是sql语句正确都是返回true

    [PDO对象操作数据库] PDOstament对象执行execute()函数,只要是sql语句正确都是返回true. 问题: 想要PDO对象实现更改一条记录, 并修改是否成功要返回信息给用户. 上我的 ...

  2. isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值则返回true

    isNaN() 函数用于检查其参数是否是非数字值.如果是非数字值则返回true.document.write(isNaN(0)); falsedocument.write(isNaN("He ...

  3. Android中使用BufferedReader.readline阻塞读取不到数据,但是ready返回true

    通过socket测试工具在电脑上发送消息,Android真机可以收到响应BufferedReader.ready()返回true,但是readline却一直阻塞. 原因:readline()只有在遇到 ...

  4. 关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考

    看见这个面试题目,第一反应就是在变量a取值时进行了一些改变,那就要用getter,关于存取器的介绍可以看这里 var temp = 1; Object.defineProperty(window, ' ...

  5. empty对如下8种情况返回true

    1.strrchr函数 在W3School站点上的注释如下: strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符.如果成失败,否则返回 fals ...

  6. <!-- str.startsWith('胡') 检查一个 字符串中是否有某字符 返回true false -->& vh 属性

    1.<!-- str.startsWith('胡')  检查一个 字符串中是否有某字符 返回true false --> 2. vh 分享到选择其它项   复制本页链接 版本:CSS3 补 ...

  7. 简写代码:当变量为false时['',false,null,undefined,0,NaN]时,返回默认值

    当变量为'',false,null,undefined,0,NaN时,返回默认值 var a='' a || 'hello world'   "hello world" var a ...

  8. WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因

    原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...

  9. 写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true;

    写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true:也就是实现这样一个函数boolean isPalindrome(int x); 分析一下,该题目主要是通过 ...

随机推荐

  1. Linux嵌入式 -- 内核 - proc文件系统

    1. 什么是proc文件系统? 实例:通过 /proc/meminfo,查询当前内存使用情况. 结论:proc文件系统是一种在用户态检查内核状态的机制. 2.Proc文件分类 特点  每个文件都规定了 ...

  2. 51nod 1363 最小公倍数的和 欧拉函数+二进制枚举

    1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3 ...

  3. App测试经验分享之登录注册

    要诀 另外自己总结了一些要诀,仅供参考: 1)快:快速操作,营造冲突的场景,例如加载过程中返回键交互,快速点击登录按钮,快速切换菜单项,快速多次上下拉刷新 2)变:手机横竖屏.手机切换语言.手机调整字 ...

  4. 网页seo

    两大 网站布局和代码编辑 网站结构布局优化 1.控制首页链接数量 100以内2.偏平化的目录层次 百度蜘蛛点三次 超过三次,找不到结果. 导航SEO优化导航最好是文字 图片最好都加上 title 和a ...

  5. 《Think in Java》(九)接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法: 抽象化类则是普通类与接口之间的一种中庸之道: 涨姿势了 接口也可以拥有值属性,但它们都是隐式的 static 和 final 的: 接 ...

  6. servlet cannot be resolved to a type解决办法

    工程里的路径权限高,eclipse并到classpath里寻找jar位置. 项目名-->右键 Property-->选择 Build Path-->选择 Configure Buil ...

  7. Mac开机启动

    1. Finder打开资源库的LaunchAgents目录. 打开Finder,按⇧⌘G,输入 /Library/LaunchAgents/ 以及 ~/Library/LaunchAgents/ 2. ...

  8. 删除OSX中第三方的「偏好设置」程序(.prefPane)

    打开Finder,按Command+Shift+G,输入 /Library/PreferencePanes ~/Library/PreferencePanes 前一个是全局的配置项目录,第二个是当前用 ...

  9. CC++中sizeof函数的用法

    C/C++中sizeof()函数的用法 学习C/C++有时会遇到下面的情况: 已知 char *str1="absde"; char str2[]="absde" ...

  10. SQLSERVER XML 类型列的模糊查询

    select <column_name> from MyTable where <column_name>.value('(/root/sub-tag)[1]', 'varch ...