in array php 坑,php – 为什么in_array()返回意外/奇怪的结果?

解决方案(简而言之):

使用in_array()始终使用第三个参数strict true:

$arrayWithTrue = ['Andreas',$arrayWithTrue,true)); // returns bool(false)

var_dump(in_array(0,$arrayWithNull,true)); // returns bool(false)

var_dump(in_array(true,[-1],true)); // returns bool(false)

因此,当您使用in_array()并将true作为第三个参数时,搜索值与数组之间的比较是严格完成的,这意味着in_array()的工作方式与您可能期望的一样.

说明

如果没有将参数strict设置为true,则搜索的值与数组的每个值之间的比较是通过相等而不是通过标识来完成的.这意味着值的类型无关紧要,因此PHP在内部将值转换为相同的数据类型,以便能够比较它们.

这意味着在第一个示例中,搜索到的值“Gary”在与true进行比较时会转换为布尔值,因此会导致true与true的比较,这显然是正确的.

第二个数组也是如此,其中0最后与null进行比较,结果为true,即使0显然与null不同(例如,当您处理数字和/或函数结果时,这可能特别棘手,其中null可以表示空值而不是0).

然后第三个数组看起来很奇怪,因为我们检查数组中的值true,它只包含-1,但in_array()仍然返回true以进行比较.在这种情况下,-1转换为布尔值true.所以两个方向的问题都是一样的.

您可以在this Stack Overflow answer中找到有关PHP中比较问题的更多示例(因为这与== / ===相同).

不幸的是,调用in_array()时strict参数的默认值是……好吧,是的,假的. : – / PHP和它的输入…

后果

如果没有将strict参数设置为true,您应该永远不会调用in_array().如果没有混合类型的数组,并且只检查具有相同类型的值,则in_array()将按预期工作.看这个例子:

$arrayWithStrings = ['Andreas','Friedrich'];

var_dump(in_array('Gary',$arrayWithStrings)); // returns bool(false)

所以至少这可以按预期工作.但在我看来,总是使用严格的true调用in_array()要容易得多. (与“sql注入问题”类似…只是总是使用PDO和预处理语句,所以你是安全的,即使它是一个没有可变参数的查询.那么你总是安全的.)

但要小心

你绝对应该用严格的true调用in_array().但是有一个缺点,我想提一下(尽管很明显).在调用in_array()时,您必须使用正确的类型:

$arrayWithNumbers = [1,3];

var_dump(in_array('1',$arrayWithNumbers,true)); // returns bool(false)

但是当你知道比较数字时,你可以使用Type Casting:

$arrayWithNumbers = [1,3];

var_dump(in_array((int)'1',true)); // returns bool(true)

奖金

// Comparing false with an empty array

var_dump(in_array(false,[[]])); // returns bool(true)

好吧,是的…只需使用严格设置为true即可.

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值