专栏首页架构精进之路为啥PHP in_array(0,['a', 'b', 'c']) 返回为true?

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

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

本文分享自微信公众号 - 架构精进之路(jiagou_jingjin),作者:架构精进之路

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员不得不知的软技能

    程序员群体不应该是一直低头敲代码,更应该掌握一些软技能,改变一贯的沉闷木讷的形象,让自己在竞争中胜出,从而职业发展更顺利。在此总结整理了几个常用软技能点供大家参...

    架构精进之路
  • 一文搞懂 Redis高性能之IO多路复用

    哈哈,反正我在面试时候经常会问候选人这个问题,这个问题其实是对redis内部机制的一个考察,可以牵扯出好多涉及底层深入原理的一些列问题。

    架构精进之路
  • 一致性算法Raft 简易入门

    当我们只有一个服务节点的情况下,是不存在节点共识的问题的,当存在多个不同服务节点时,才会引入分布式一致性的问题。

    架构精进之路
  • 炫技!JavaScript 的花式玩法

    JavaScript 是一个伟大的语言。它有简单的语法,完善的生态系统,更重要的,有一个庞大的社区。

    疯狂的技术宅
  • 20180803_ARTS_week06

    这个是个比较不好的解法,就是像题目介绍里面那样先把这个『之』字形给做出来,然后再逐行读成字符串,但是通过这个比较好帮助我们理解这个题目。

    Bob.Chen
  • 实践|OpenCV4.2使用DNN进行人脸检测一(图片篇)

    使用OpenCV进行人脸检测我写过两篇文章《C++ OpenCV之级联分类器--人脸检测》和《Android NDK OpenCV级联方式实时进行人脸检测》,不...

    Vaccae
  • 看ThreadPoolExecutor源码前的骚操作

    最近一个月看了学习了很多关于SQL性能优化、Spring核心源码分析、MyBatis核心源码分析、JUC并发包下面的知识点,感觉收获很多。这几天,会陆陆续续...

    用户2032165
  • 阿里云天池每周限时赛(内测版) 第3场

    用户7727433
  • 希尔排序

    #include<stdio.h> void ShellSort(int array[],int length) { int i,j,h,temp; ...

    用户1624346
  • 摩拜 [编程题] 排序次数

    小摩有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的小摩只会下面这个操作:

    week

扫码关注云+社区

领取腾讯云代金券