in_array 判断的那些坑

一叶而不知秋

向管中窥豹寻知外,坐井观天又出来。

今天,有个同事问了我如下一个问题。代码如下:

说为何会返回是true,我们都知道in_array其实只是判断该字符串是否存在于数组value之中。于是我思考了下,会不会是因为在判断值相等时候将字符串‘sh’==0来做了比较呢?让同事将值改成1后,代码如下:

果然预期返回了false。为了一探究竟,于是自己写了各种小demo去验证。

情况一

output:in array

情况二

output:no

看似一切正常

情况三

output:in array

难以置信,这不坑爹吗,0不在列表中,但是这个函数返回true。这个函数很常用,所以当某些巧合出现后,就会导致不可预料的错误。

一开始我猜测in_array函数除了在values中寻找,还会去寻找keys,后来发现不是这样的。

情况四

output:no

是不是很有意思?

原因

我们先来看看官方文档中的一个案例:

http://www.php.net/manual/en/language.operators.comparison.php

原来是因为:

PHP比较数字和字符串时,会尝试将字符串转换为数字再进行比较。 例子中的 'a', 'b', 'c' 转成数字都是0,所以和0相等,in_array就返回了true。

如何避免

PHP的类型戏法是把双刃剑,有时候很爽,有时候很贱。

所以当in_array的needle与array中的值类型是否相同还不确定时,最好设置in_array函数的第三个参数 strict = true,这样在检查的时候会检查类型,数字与字符串就不会偷偷相等,也就避免类似这种问题。

output:no

你如果想学技术 | 屯干货 | 聊职场

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181220G11IIP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券