为啥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,这样有时会导致不可预料的结果

相关文章
|
4月前
|
JavaScript 前端开发 PHP
|
搜索推荐 算法 PHP
PHP 数组(Array) - 排序算法
PHP 数组(Array) - 排序算法
52 0
|
PHP 索引
PHP 数组(Array)
PHP 数组(Array)
70 0
|
PHP
php函数基础学习:array_chunk() 函数把一个数组分割为新的数组块
php函数基础学习:array_chunk() 函数把一个数组分割为新的数组块
63 0
|
JSON PHP 数据库
PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换
PHP:Laravel cast array json数据存数据库时unicode 编码问题和update更新不触发数据转换
167 0
|
SQL PHP
php递归函数返回值返回不出的问题
php递归函数返回值返回不出的问题
72 0
php递归函数返回值返回不出的问题
|
存储 JSON 安全
为什么我觉得GoFrame的garray比PHP的array还好用?
写过PHP的同学都知道 PHP的数组Array非常好用,特别灵活。我在写PHP之前使用Java做安卓开发,在接触PHP的数组Array之后,直呼太香了!
为什么我觉得GoFrame的garray比PHP的array还好用?
PHP 简单 对象 (object) 与 数组 (array) 的转换
PHP 简单 对象 (object) 与 数组 (array) 的转换
PHP:array_flatten多维数组扁平化
PHP:array_flatten多维数组扁平化
146 0