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。

替换解决方案:

1isset($arrayList[$num]);
2array_key_exists($num,$arrayList)
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9

in_array() 函数 还有第三个 参数 ,可以设置成 true ,判断全等,默认是 false 非全等。

1年前 评论
MuBaiYang (楼主) 1年前
╰ゝSakura

隐式类型转换了, S 跟 数字0比较的时候,S 字符串类型转成数字0了, 0跟0比较自然就是true,用in_array 第三个参数,判断全等吧

1年前 评论
MuBaiYang (楼主) 1年前

总结:虽然php可以这么写数组,但你最好不要这么用,要么都数字索引,要么都字符串索引,那么原本就不会出现你这个问题了。

1年前 评论
MuBaiYang (楼主) 1年前

file
8.0以后就修复了,你把key中的0删除你的写法也是对的

 isset($arrayList($num))
1年前 评论
MuBaiYang (楼主) 1年前

php历史遗留问题,可以通过in_array第三个参数做全类型比较,或者升级php版本。 file

参考: www.php.net/releases/8.0/zh.php

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!