为什么PHP in_array(0,['a', 'b', 'c']) 返回为true
发表于:2023-02-07 作者:安全数据网编辑
编辑最后更新 2023年02月07日,本篇文章为大家展示了为什么PHP in_array(0,['a', 'b', 'c']) 返回为true,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。0、 问
本篇文章为大家展示了为什么PHP in_array(0,['a', 'b', 'c']) 返回为true,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
在具体PHP编码过程中,总会出现一些我们认为不可能的情况,如下几例:
in_array(0, ['a', 'b', 'c']) // 返回bool(true),相当于数组中有0
array_search(0, ['a', 'b', 'c']) // 返回int(0),相当于是第一个值的下标
0 == 'abc' // 返回bool(true),相当于等值
但是,直观上看, 0并没有包含在['a', 'b', 'c']数组中,也不会等于'abc'这个字符串。那怎么解释上述的返回结果呢?
究其原因:在数据比较前,PHP做了类型转换。引用PHP官网关于"String conversion to numbers"解释如下:
When a string is evaluated in a numeric context, the resulting value and type are determined as follows.
If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float.
The value is given by the initial portion of the string. If the string starts with valid numeric data, this
will be the value used. Otherwise, the value will be 0 (zero). Valid numeric data is an optional sign, followed by one or more digits (optionally containing a decimal point), followed by an optional exponent. The exponent is an 'e' or 'E' followed by one or more digits.
文章开篇例子中,string类型数据第一个字符不是数字,就会转换为0,例如:
echo intval('abc'); // 输出0
inarray()和arraysearch()默认都是松散比较,相当于==,即得到true。
那怎么得到我们预期的结果呢?使用严格比较,如下所示:
in_array(0, ['a', 'b', 'c'], true) // 返回bool(false)
array_search(0, ['a', 'b', 'c'], true) // 返回bool(false)
0 === 'abc' // 返回bool(false)
那么,如果用false和null与字符串数组比较,结果会如何呢?
in_array(null, ['a', 'b', 'c']) // 返回bool(false)
in_array(false, ['a', 'b', 'c']) // 返回bool(false)
null与false做比较值,字符串数组是不会转换为int型的。
另一个看起来比较奇怪的现象
in_array('a', [true, 'b', 'c']) // 返回bool(true),相当于数组里面有'a'
array_search('a', [true, 'b', 'c']) // 返回int(0),相当于找到了字符串'a'
PHP语言本身是弱类型语言,为了便于应用处理,会做一些类型转换操作。
同时为了保证转换精度准确性等问题,PHP官方建议:不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。
上述内容就是为什么PHP in_array(0,['a', 'b', 'c']) 返回为true,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
c语言网络技术和编程语言总结
c语言对应的三级考试网络技术
网站服务器后台如何加防护密码
c语言软件开发步骤
c语言中网络技术知识点
服务器对权限提升的防护措施
怎么在阿里云租服务器
黑苹果能做web服务器吗
c语言和网络技术哪个好考
云服务器2核4G是什么性能
2019漫说网络安全
uk开票服务器连接异常
虹口区专业性软件开发值得推荐
网络安全员是怎么回事
计算机网络技术有软件课程吗
巴蜀网络安全比赛
华为手机的服务器怎么使用
重庆玖华互联网科技有限公司
国务院消费扶贫数据库
福建信息技术数据库管理会考
甘肃网络时钟服务器云服务器
无法正确连接服务器
泰安市地面气象资料数据库
吴江通鼎软件开发
盆景设计软件开发
数据库时间加5分钟
程序员保存数据库
中国中央数据库
数据库为什么要有触发器
无锡银联计算机网络技术服务优势
分布式数据库设计要求
java数据库删除和增添
网络技术培训图片
华为手机的服务器怎么使用
浦东新区公司软件开发市场
捕鱼服务器端编程
四川网络安全培训会
抖音网络安全平台中心
怎样删除数据库
家乐淘网络技术有限公司