gpt4 book ai didi

php - 为什么 in_array() 返回意外/奇怪的结果?

转载 作者:可可西里 更新时间:2023-11-01 12:45:54 26 4
gpt4 key购买 nike

为什么 in_array() 有时会表现得如此奇怪并返回如此意外的结果?

让我们看几个例子:

$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', 'Philipp', true];
$arrayWithNull = [1, 2, 3, null];
$arrayWithMinusOne = [-1];

var_dump(in_array('Gary', $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 进行比较时被转换为 bool 值,因此比较结果为 truetrue,这显然是 true

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

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

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

不幸的是,当调用 in_array() 时,strict 参数的默认值是......嗯,是的,false。 :-/PHP 正在输入...

后果

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

$arrayWithStrings = ['Andreas', 'Philipp', 'Friedrich'];
var_dump(in_array('Gary', $arrayWithStrings)); // returns bool(false)

所以至少这按预期工作。但在我看来,始终使用 strict true 调用 in_array() 会容易得多。 (类似于“SQL 注入(inject)问题”......只要始终使用 PDO 和准备好的语句,这样你就安全了,即使它是一个没有可变参数的查询。那么你总是安全的。)

小心点

您绝对应该使用 strict true 调用 in_array()。但是有一个缺点,我确实想提一下(尽管很明显)。调用 in_array() 时一定要使用正确的类型,然后:

$arrayWithNumbers = [1, 2, 3];
var_dump(in_array('1', $arrayWithNumbers, true)); // returns bool(false)

但是当您知道要比较数字时,您可以只使用类型转换:

$arrayWithNumbers = [1, 2, 3];
var_dump(in_array((int)'1', $arrayWithNumbers, true)); // returns bool(true)

奖金

// Comparing false with an empty array
var_dump(in_array(false, [[]])); // returns bool(true)

嗯,是的...只需将 strict 设置为 true 即可使用它。 ;-)

关于php - 为什么 in_array() 返回意外/奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37080581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com