问题
今天在写一个接口的时候, 需要传入大量的基本信息参数, 参数分别是 int 和 string 两种类型, 为了校验方便, 我打算把所有的参数都放在数组中, 然后用 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)
等价于将数组中的每个 value 与 search 比较, 由于我 $param 数组中除了有 int 参数, 还有一个 string 参数, 相当于用 string 和 int 去比较, 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 存一个数组, 两个不同类型的数组分别进行数据校验, 这样也不会出现上面的问题
来源: http://www.jianshu.com/p/2b3e687879ac