PHP中in_array的隐式转换

问题

今天在写一个接口的时候,需要传入大量的基本信息参数,参数分别是intstring两种类型,为了校验方便,我打算把所有的参数都放在数组中,然后用in_array(0, $param)判断 int 参数是否为0,再单独判断string参数是否为空,示例代码如下:

            if(in_array(0, $param) || $param['img'] == '') {
                $this->errorCode = 10030;
                $this->errorMessage = '参数不正确';
                return false;  
            }
可是自测时发现,传入正确的参数,都会返回参数不正确的提示!!!

原因

出现这种情况,正是因为in_array惹的祸,in_array(search,array)等价于将数组中的每个valuesearch比较,由于我$param数组中除了有int参数,还有一个string参数,相当于用stringint去比较,PHP的隐式转换规则:

非数字字符串和整数比较,字符串自动转换为int(0)

下面的例子就验证了我们的说法:

<?php

    $a = (int)'abc';
    var_dump($a);  //int(0)

    $c = array(0,1,2,3);
    if(in_array('abc', $c)) {
        echo 'exist';
    } else {
        echo 'not exist';
    } //exist  

解决办法

  • in_array增加第三个参数true,用来检查搜索的数据与数组的值的类型是否相同,这样函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true
  • 针对我上面出现的业务,完全可以严谨一些,将int型数据存一个数组,string存一个数组,两个不同类型的数组分别进行数据校验,这样也不会出现上面的问题
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,317评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 亲爱的学生家长: 您好, 首先,非常感谢您对立幼书院的信任,也非常感谢整个学期您对孩子的关注,这让我们的工作变...
    立幼原老师阅读 1,401评论 0 3
  • 男主开口说的第一句话就是不要走... 等了你半个世纪,为了你学会写字,说话,画画,为了你修补吉他,堆雪人。 “我一...
    恋上白纸的鱼阅读 256评论 0 0