为什么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. jmeter ant 运行 提示Error occurred during initialization of VM

    运行ant提示错误 网上找到的方法 将set HEAP= -Xms512m -Xmx1024m 改成set HEAP= -Xms512m -Xmx512m 保存后运行成功

  2. iOS系统声音服务(System Sound Services)

    系统声音服务(System Sound Services)提供了一个接口,用于播放不超过30秒的声音.它支持的文件格式有限,具体地说只有CAF.AIF和使用PCM或IMA/ADPCM数据的WAV文件. ...

  3. PyCharm 的初始设置1

    PyCharm 的初始设置 PyCharm 的官方网站地址是:https://www.jetbrains.com/pycharm/ 01. 恢复 PyCharm 的初始设置 PyCharm 的 配置信 ...

  4. phalcon查询:单条查询,多条查询,多表查询

    单条查询, $order = \OrderMain::findFirst("oid='" . $oid . "'"); 多条查询, $shop = \Order ...

  5. java: Comparable比较器,数组对象比较器

    Arrays只适合一个数组/对象内的数值进行比较, Comparable比较器(Compara)适合数组,对象,队列等排序, Comparable是一个接口类,实现此接口必须复写:compareTo ...

  6. Python—numpy.flatnonzero()

    numpy.flatnonzero(): 该函数输入一个矩阵,返回扁平化后矩阵中非零元素的位置(index) 这是官方文档给出的用法,非常正规,输入一个矩阵,返回了其中非零元素的位置. 1 >& ...

  7. Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2) E

    题意:减前面的数,加后面的数,保证最后不剩下数,加减次数要相同: 题解:emmmmm,看出是个贪心,先对价值排序,相同就对下标排序,规律是每次找第一个,然后从后往前找没有使用过的下表比他大的第一个,相 ...

  8. SPOJ - BALNUM 数位dp

    题意:求某一区间内的平衡数个数(指一个数,其中出现过的数,如果是偶数,那么必须出现奇数次,反之偶数次) 题解:用三进制来枚举(0到9)所有情况,0代表没有出现,1代表出现奇数次,2代表出现偶数次dp[ ...

  9. macvim/babun+spf13-vim

    mac: macvim brew install macvim --with-cscope --with-lua --with-override-system-vim brew linkapps ma ...

  10. hdu 2509 Be the Winner(anti nim)

    Be the Winner Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...