首页 > 其他分享 >为啥in_array(0, ['a', 'b', 'c']) 会返回true?

为啥in_array(0, ['a', 'b', 'c']) 会返回true?

时间:2022-11-11 11:33:04浏览次数:63  
标签:返回 search false string 为啥 array 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官网上关于“String conversion to numbers”的说明:​​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​​。

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


标签:返回,search,false,string,为啥,array,true
From: https://blog.51cto.com/u_15107509/5843767

相关文章

  • 【java八股】ArrayList自动扩容过程
    ArrayList是一个数组类型的存储容器,默认大小是10个容量的数组,容量也可以在构件ArrayList的时候通过构造器指定大小,当容量不够时会进行自动扩容到原来的1.5倍,由于底层是数组......
  • ArrayBlockingQueue简单介绍
    ArrayBlockingQueue是一个用数组实现的环形队列,在构造方法中,会要求传入数组的容量创建数组长度为10的有界队列,数据类型为字符串BlockingQueue<String>blockingQueue=......
  • ArrayList的构造函数
    近期针对于项目中的一些关于ArrayList的使用,在对于ArrayList构造方法搞不清楚,所以来写个总结。直接看构造方法:无参构造方法/***Constructsanemptylistwi......
  • python get请求传array数组
    前言使用传统的http发get请求时,如果传参为array数组,参数名称为a时,可以这样传值a=1&a=2&a=3,但是当只有一个时,这种方式就不合理了。get请求还有另外一种方式传array数组,在......
  • 2022 杭电杯(7) I Counting Good Arrays
    本题是2022CCPCF题的强化版.给出一个n,m求出所有长度小于等于n的数列\(a_k(k\len)\)且\(a_k\lem\)且\(a_i|a_{i+1}\)固定n显然可以发现对于m的标准分解\(m=p_1^{k......
  • openGL——glDrawArrays 和 glDrawElements
    在openGL中,所有图形都是通过分解成三角形的方式进行绘制。(一个矩形分解成两个三角形进行绘制)glDrawArrays和glDrawElements的作用都是从一个数据数组中提取数据渲染基......
  • 【JavaScript 教程】第六章 数组03— Stack :使用 Array 的push()和pop()方法实现堆栈
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节,我们学习了JavaScriptArray length属性以及如何正确处理它,错过的小伙伴可以点击文章《​​【JavaScrip......
  • ndarray 的创建及属性
    1.ndarray的创建及获取属性上节课我们有提到过ndarray的创建,我只需要将列表传入到np.array()函数中。例如:importnumpyasnpmy_list=[1,2,3,4,5,6]my_arr=n......
  • 小新学Java5-【String类、static关键字、Arrays类、 Math类】
    一、String类1.String类概述 创建字符串的3+1种方式:三种构造方法:①publicString():创建一个空白字符串,不含任何内容。②publicString(char[]array):根据字符数组的......
  • Array.prototype.at。Arrat和 String 中的 at 方法
    一篇有关新js特性at方法的思考入参只能是number类型,允许入参有小数(按照chromeDevToolsConsole测试确实可以带小数)有返回值,如果对应下标在实例中存在,则返回对应......