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)
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 9

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

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

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

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

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

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

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

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

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

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

2年前 评论