我们来看几个例子:
$arrayWithTrue = ['Andreas','Philipp',true]; $arrayWithNull = [1,2,3,null]; $arrayWithMinusOne = [-1]; var_dump(in_array('Gary',$arrayWithTrue)); // returns bool(true) var_dump(in_array(0,$arrayWithNull)); // returns bool(true) var_dump(in_array(true,$arrayWithMinusOne)); // returns bool(true)
咦?这里发生了什么事!?
(几年前,我开始对这种奇怪的行为感到疑惑.我认为这可能对某些人有用,因此我输入了这个问题.)
使用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也在php.net documentation中描述.)
说明
如果没有将参数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即可. 原文链接:https://www.f2er.com/php/134761.html