为什么in_array(0, ['a', 'b', 'c'])返回true

目录

  • 1 类型转换
  • 2 严格比较
  • 3 false和null
  • 4 数组中有true

在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

那么,如果用falsenull与字符串数组比较会如何呢?

它们是不会转换成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

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

参考资料:

  1. Php, in_array, 0 value
  2. PHP in_array() / array_search() odd behaviour
  3. String conversion to numbers

为什么in_array(0, ['a', 'b', 'c'])返回true的更多相关文章

  1. PDOstament对象执行execute()函数,只要是sql语句正确都是返回true

    [PDO对象操作数据库] PDOstament对象执行execute()函数,只要是sql语句正确都是返回true. 问题: 想要PDO对象实现更改一条记录, 并修改是否成功要返回信息给用户. 上我的 ...

  2. isNaN() 函数用于检查其参数是否是非数字值。如果是非数字值则返回true

    isNaN() 函数用于检查其参数是否是非数字值.如果是非数字值则返回true.document.write(isNaN(0)); falsedocument.write(isNaN("He ...

  3. Android中使用BufferedReader.readline阻塞读取不到数据,但是ready返回true

    通过socket测试工具在电脑上发送消息,Android真机可以收到响应BufferedReader.ready()返回true,但是readline却一直阻塞. 原因:readline()只有在遇到 ...

  4. 关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考

    看见这个面试题目,第一反应就是在变量a取值时进行了一些改变,那就要用getter,关于存取器的介绍可以看这里 var temp = 1; Object.defineProperty(window, ' ...

  5. empty对如下8种情况返回true

    1.strrchr函数 在W3School站点上的注释如下: strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符.如果成失败,否则返回 fals ...

  6. <!-- str.startsWith('胡') 检查一个 字符串中是否有某字符 返回true false -->& vh 属性

    1.<!-- str.startsWith('胡')  检查一个 字符串中是否有某字符 返回true false --> 2. vh 分享到选择其它项   复制本页链接 版本:CSS3 补 ...

  7. 简写代码:当变量为false时['',false,null,undefined,0,NaN]时,返回默认值

    当变量为'',false,null,undefined,0,NaN时,返回默认值 var a='' a || 'hello world'   "hello world" var a ...

  8. WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因

    原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...

  9. 写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true;

    写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true:也就是实现这样一个函数boolean isPalindrome(int x); 分析一下,该题目主要是通过 ...

随机推荐

  1. [转载]spring security 的 logout 功能

    原文地址:security 的 logout 功能">spring security 的 logout 功能作者:sumnny 转载自:http://lengyun3566.iteye ...

  2. EntityFramework 学习 一 Colored Entity in Entity Framework 5.0

    You can change the color of an entity in the designer so that it would be easy to see related groups ...

  3. vc 自删除

    // delself.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include <windows.h>#include &l ...

  4. ztree高级实例(原创)

    最近项目中需要设计一个类似收藏夹的功能保存用户常用的东西,需要客户体验好,所以想到了以前用过的ztree. 在用ztree的过程中遇到一些问题,在此记录,提醒自己,也帮助遇到相同情况的同行们. 1.至 ...

  5. Java -- 数据库 多表操作,1对多,多对多,1对1。 基于dbutils框架

    1. 1对多,部门--员工 为例, 多的一方建外键. domain,建立bean对象 public class Department { private String id; private Stri ...

  6. poj 1011 :Sticks (dfs+剪枝)

    题意:给出n根小棒的长度stick[i],已知这n根小棒原本由若干根长度相同的长木棒(原棒)分解而来.求出原棒的最小可能长度. 思路:dfs+剪枝.蛮经典的题目,重点在于dfs剪枝的设计.先说先具体的 ...

  7. java中的向下转型

    1.父类对象可以强制转换为子类对象,但是前提是此父类对象为子类对象实例化的结果. e.g. Fruit fruit=new Apple(); Apple a=(Apple)fruit;//ok e.g ...

  8. review10

    public int indexOf(String s); 字符串的索引位置时从0开始的(只有一个参数时),从当前字符串的头开始检索字符串s,并返回首次出现s的索引位置.如果没有检测到字符串s,该方法 ...

  9. java:RandomAccessFile随机读取文件内容

    RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. ...

  10. hdu1863(最小生成树)

    很裸的最小生成树,但要注意判断输出问号的情况.其实就是当给的图不是连通图时输出问号.判断方法是:看形成的最小生成树的边数是不是等于节点数减一. #include<iostream> #in ...