php in_array confusion:严格的设置

时间:2012-07-20 09:40:39

标签: php types

整个早上我都在使用php in_array()函数。最终我能够解决它但我对设置解决问题的原因感到有点困惑。

我将变量$ type设置为字符串值(确切地说是'forum'),将$ all_types设置为如下所示的数组:

$ all_types:

[protocol2] => protocol2
[group] => 0
[post] => 0
[forum] => 0
[article] => 0
[page] => 0
[protocol1] => 0

然后我有:

if (in_array($type,$all_types) !== FALSE) {
  "Do stuff..."
}

并且“做东西......”不断发生。首先我认为这是因为它击中了数组中的'forum'键,所以我尝试将数组更改为:

[0] => protocol2
[1] => 0
[2] => 0
[3] => 0
[4] => 0
[5] => 0
[6] => 0

但它仍然无效。最后我将STRICT变量设置为TRUE,它似乎工作正常,即使使用原始数组也是如此。

那为什么呢? STRICT = TRUE意味着针和大海捞针中的值必须是相同的类型,但是当它们匹配时它们不是两个字符串吗?当他们不这样做时,你将'论坛'与0比较,并且出于某种原因这样做会匹配吗?

3 个答案:

答案 0 :(得分:3)

适用于Type Juggling。当您使用'STRICT'为FALSE时,in_array使用'=='运算符比较值。 你知道,var_dump('string' == 0);是真的。

因此,当数组中有不同类型的值时,将它与严格比较进行比较总是好的。

http://www.php.net/manual/en/language.operators.comparison.php

答案 1 :(得分:0)

当您更改$ type的值时,这可以正常工作。正如你在问题中暗示的那样,打字玩杂耍会让意想不到的事情发生,所以坚持严格。

<?php
$type      = 'forum';
$all_types = array(
    'protocol2' => 'forum',
    'group' => 0,
    'post' => 0,
    '1' => '0',
    'article' => 0,
    'page' => 0,
    'protocol1' => 0
);

if (in_array($type, $all_types, TRUE)) {
    echo "Here";
} else {
    echo "Not Here";
}

答案 2 :(得分:-2)

看起来你应该使用array_key_exists - 因为你正在测试数组键而不是值(这是in_array的作用)。