为什么in_array(0, ['a', 'b', 'c'])返回true
为什么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
那么,如果用false和null与字符串数组比较会如何呢?
它们是不会转换成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。
要想不相等,用严格比较。
参考资料:
为什么in_array(0, ['a', 'b', 'c'])返回true的更多相关文章
- PDOstament对象执行execute()函数,只要是sql语句正确都是返回true
[PDO对象操作数据库] PDOstament对象执行execute()函数,只要是sql语句正确都是返回true. 问题: 想要PDO对象实现更改一条记录, 并修改是否成功要返回信息给用户. 上我的 ...
- isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值则返回true
isNaN() 函数用于检查其参数是否是非数字值.如果是非数字值则返回true.document.write(isNaN(0)); falsedocument.write(isNaN("He ...
- Android中使用BufferedReader.readline阻塞读取不到数据,但是ready返回true
通过socket测试工具在电脑上发送消息,Android真机可以收到响应BufferedReader.ready()返回true,但是readline却一直阻塞. 原因:readline()只有在遇到 ...
- 关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考
看见这个面试题目,第一反应就是在变量a取值时进行了一些改变,那就要用getter,关于存取器的介绍可以看这里 var temp = 1; Object.defineProperty(window, ' ...
- empty对如下8种情况返回true
1.strrchr函数 在W3School站点上的注释如下: strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符.如果成失败,否则返回 fals ...
- <!-- str.startsWith('胡') 检查一个 字符串中是否有某字符 返回true false -->& vh 属性
1.<!-- str.startsWith('胡') 检查一个 字符串中是否有某字符 返回true false --> 2. vh 分享到选择其它项 复制本页链接 版本:CSS3 补 ...
- 简写代码:当变量为false时['',false,null,undefined,0,NaN]时,返回默认值
当变量为'',false,null,undefined,0,NaN时,返回默认值 var a='' a || 'hello world' "hello world" var a ...
- WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因
原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...
- 写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true;
写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true:也就是实现这样一个函数boolean isPalindrome(int x); 分析一下,该题目主要是通过 ...
随机推荐
- Freemarker 使用
Freemarker 使用 博客分类: JAVA freemarker 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个 ...
- 【转】数据库获得当前时间getdate()
CONVERT(nvarchar(10),count_time,121): CONVERT为日期转换函数,一般就是在时间类型 (datetime,smalldatetime)与字符串类型(nchar, ...
- Codeforces Round #412 div2 ABCD
A 按rank给出每个人的赛前分数和赛后分数 如果一个人打败了比他分数高的人 他的分数必然升高 问比赛rated吗 如果一个人的分数改变了肯定rate 如果全都没改的话 也可能是rated 这时候ch ...
- Linux嵌入式 -- 内核 - 系统调用
1. 系统调用 定义 Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们. 系统调用和普通的函数调用非常相似,区别仅仅在于,系统调 ...
- Python之Django总结
一.Django 总结django知识点 一.视图函数: 请求对象-----------request: 1.HttpRequest.body: 请求原 ...
- Grid_自绘
ZC: 测试使用的控件是 Delphi7版本的 TAdvStringGrid(第3方控件) “DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: ...
- JAVA中的泛型类型不可以直接初始化
class Para<CLS>{ private CLS class1; public Para(CLS class1) { ...
- 有关linux下redis overcommit_memory的问题,有需要的朋友可以参考下。
我在安装redis-4.0.6后,启动时出现一些问题,如下: :M Jan ::! Background save may fail under low memory condition. To fi ...
- c#加密,java解密(3DES加密)
c#代码 using System; using System.Security; using System.Security.Cryptography; using System.IO; using ...
- mysql 注意事项
1. mysql所有的存储引擎均不支持check约束,但可以使用check约束,而没有任何效果