为什么要使用!== FALSE来检查php中的stripos?

时间:2009-03-30 23:51:23

标签: php comparison operators conditional

以下是我正在查看的代码。

foreach ($header as $idx => $field) {
    if (stripos($field, 'foo') !== false) {
        $cols['foo'] = $idx;
    } else if (stripos($field, 'bar') !== false) {
        $cols['bar'] = $idx;
    } else if (stripos($field, 'brr') !== false) {
        $cols['brr'] = $idx;
    } else if (stripos($field, 'ffo') !== false) {
        $cols['ffo'] = $idx;
    }
}

抱歉,不知道如何格式化代码,任何提示都会受到赞赏。

我正在看一些比我聪明的人编写的代码,所以我不会相信我的第一印象就是将所有内容都改为if(stripos($foo)),但为什么会这样呢?

5 个答案:

答案 0 :(得分:49)

答案是在PHP中可以通过少量值来满足“false”值,例如空数组,空字符串,NULL,整数0等。请参阅empty()函数页面以获取完整清单:

http://php.net/empty

所以这会总是产生不正确的结果:

if(strpos("abc", "a")) { 
  echo "Yes";
} else {
  echo "No";
}

由于“a”出现在第一个位置(索引0),因此PHP认为“if(0)”为false。

当strpos在大海捞针中找不到针时,它将返回布尔值FALSE,这是你要用三等运算符检查的,它检查类型和值。请参阅有关比较运算符的文档

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

答案 1 :(得分:7)

stripos返回另一个字符串的位置,如果找不到该字符串,则返回false,因此建议使用标识comparison operators(===,!==) ,因为PHP将0视为“虚假”值,请考虑以下示例:

// Find the position of the 'a' character in the 'abc' string:
stripos('abc', 'a') !== false; // true, position is 0
stripos('abc', 'a') != false; // false, 0 is "falsy"

答案 2 :(得分:5)

因为如果字符串在位置0处匹配,则0的计算结果为false,因此您确保添加额外的'='以便考虑该类型。

strpos()在找到 NO 匹配时返回false。

查看comparison operators

答案 3 :(得分:5)

在PHP中,!==表示不具有相同类型的AND值。

如果stripos()返回除false之外的任何内容(并且恰好为'false',而不是零),则表示它已找到某些内容,即使该位置为0且返回了int(0)。与 == 进行标准比较时0和false相等,但在使用身份 === 运算符时则不相等,因此了解stripos()是否有唯一的方法发现可以肯定的是比较 false 的值和类型使用!==(不完全相同,即strpos()的返回值的类型和值都相同。)

答案 4 :(得分:3)

Dunno如果这样的事情会更容易维护。取决于你是否在那些条件下做了其他事情。但您可以在配置文件中设置密钥,db,作为函数的参数传递,或者类似。

$keys = array(
    'foo',
    'bar',
    'brr',
    'ffo',
);
foreach ($header as $idx => $field) {
    foreach ($keys as $key) {
        if (stripos($field, $key) !== false) {
            $cols[$key] = $idx;
            break;
        }
    }
}