zoukankan      html  css  js  c++  java
  • 为什么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

    那么,如果用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
  • 相关阅读:
    python爬取北京政府信件信息03
    Python3.7 lxml引入etree
    python爬取北京政府信件信息02
    python爬取北京政府信件信息01
    2020.12.2收获
    2020.12.1收获
    2020.11.30收获
    2020.11.29收获
    2020.11.28收获
    2020.11.27收获
  • 原文地址:https://www.cnblogs.com/isykw/p/6703484.html
Copyright © 2011-2022 走看看