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

简介: 在具体PHP编码过程中,总会出现一些我们认为不可能的情况,如下几例

0、 问题背景


在具体PHP编码过程中,总会出现一些我们认为不可能的情况,如下几例:


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


但是,直观上看, 0并没有包含在['a', 'b', 'c']数组中,也不会等于'abc'这个字符串。那怎么解释上述的返回结果呢?


1、 类型转换


究其原因:在数据比较前,PHP做了类型转换。引用PHP官网关于“String conversion to numbers”解释如下:


When a string is evaluated in a numeric context, the resulting value and type are determined as follows.
If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float.
The value is given by the initial portion of the string. If the string starts with valid numeric data, this
will be the value used. Otherwise, the value will be 0 (zero). Valid numeric data is an optional sign, followed by one or more digits (optionally containing a decimal point), followed by an optional exponent. The exponent is an 'e' or 'E' followed by one or more digits.


文章开篇例子中,string类型数据第一个字符不是数字,就会转换为0,例如:


echo intval('abc');  // 输出0


inarray()和arraysearch()默认都是松散比较,相当于==,即得到true。


2、 严格比较


那怎么得到我们预期的结果呢?使用严格比较,如下所示:


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


3、 false 与 null


那么,如果用false和null与字符串数组比较,结果会如何呢?


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


null与false做比较值,字符串数组是不会转换为int型的。


4、 数组中有true


另一个看起来比较奇怪的现象


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


总结


PHP语言本身是弱类型语言,为了便于应用处理,会做一些类型转换操作。


同时为了保证转换精度准确性等问题,PHP官方建议:不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果

相关文章
|
SQL PHP
php递归函数返回值返回不出的问题
php递归函数返回值返回不出的问题
45 0
php递归函数返回值返回不出的问题
PHP:二维数组查找元素值并且返回下标
PHP:二维数组查找元素值并且返回下标
150 0
|
PHP
PHP面试题:对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
PHP面试题:对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
122 0
|
PHP
PHP字符串学习之利用正则过滤字符,返回数字字符
在之前的文章《PHP字符串学习之怎么去除其他字符,只留下数字》中,我们介绍了利用for循环和in_array()或is_numeric()函数来提取字符串中数字字符的方法。这次我们继续PHP字符串的学习与练习,介绍一下提取字符串中数字字符的另几种方法。 提取字符串中数字字符,本质上就是字符串过滤操作。看到字符串过滤,我就想起了 “正则表达式”。
331 0
|
Unix Serverless PHP
PHP函数运用之返回某个日期的前一天和后一天
在上一篇文章《PHP函数运用之计算截止某年某月某日共有多少天》中,我们介绍了利用strtotime()函数计算两个给定日期间时间差的方法。这次我们来来看看给大一个指定日期,怎么返回它前一天和后一天的日期。感兴趣的朋友可以学习了解一下~ 本文的重点是:返回给定时间的前一天、后一天的日期。那么要怎么操作呢? 其实很简单,PHP内置的strtotime() 函数就可以实现这个操作!下面来看看我的实现方法: 返回某个日期的前一天的实现代码
697 0
php返回支付宝success带??或?success
说明 文件编码格式问题  建议  首先自己在本地创建的文件去掉bom,也就是文本格式要改成以utf-8无bom格式编码  另外需要在输出之前加一句ob_end_clean()进行测试是否已经正常。   有问题可以在下方吐槽提问
466 0
|
PHP API 网络安全
php中curl返回false的解决办法
本文介绍一下自己在使用curl中遇到的问题解决办法。希望可以帮助到大家。 原文地址:代码汇个人博客 http://www.codehui.net/info/37.html 首先来看一个封装的curl函数 function request_post($url = '', $param = '').
2378 0
|
测试技术 应用服务中间件 PHP