您的位置:首页 > 编程语言 > PHP开发

转载php in_array()问题

2017-04-19 09:35 218 查看
先附上转载地址  http://www.awaimai.com/2078.html   本文仅作为笔记

在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

那么,如果用
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


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

 

参考资料:
Php, in_array, 0 value
PHP in_array() / array_search() odd behaviour
String conversion to
numbers
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: