in_array()的隐式转换
代码:
<?php
$arrayList = [
0,1,2,3,4,5,6,7,8,9,'A'=>10,'B'=>11,'C'=>12,'D'=>13,'E'=>14,'F'=>15,'G'=>16
];
$num = 'S';
var_dump(in_array($num,array_keys($arrayList)));
var_dump(array_keys($arrayList));
?>
结果:
bool(true)
[0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G']
现象描述:从上面的代码可以看到,“S”并不在那个数组中,但结果确是true???
现象解释:
php的in_array()方法在查找时运用了类型转换,‘S’与数字0比较时,字符串会被转化为0,因此返回true。
如果想实现===严格比较,可在数组后多加一个参数true。
替换解决方案:
1、isset($arrayList[$num]);
2、array_key_exists($num,$arrayList);
关于 LearnKu
in_array() 函数 还有第三个 参数 ,可以设置成 true ,判断全等,默认是 false 非全等。
隐式类型转换了, S 跟 数字0比较的时候,S 字符串类型转成数字0了, 0跟0比较自然就是true,用in_array 第三个参数,判断全等吧
总结:虽然php可以这么写数组,但你最好不要这么用,要么都数字索引,要么都字符串索引,那么原本就不会出现你这个问题了。
8.0以后就修复了,你把key中的0删除你的写法也是对的
php历史遗留问题,可以通过in_array第三个参数做全类型比较,或者升级php版本。