代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

为什么要用!==false检查PHP中的stripos?

  •  17
  • Jamison Dance  · 技术社区  · 16 年前

    这是我正在看的代码。

    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 回复  |  直到 15 年前
        1
  •  49
  •   Cody Caughlan    16 年前

    答案是,在php中,一个“假”值可以由少数值来满足,例如空数组、空字符串、空值、整数0等。有关完整列表,请参见empty()函数页:

    http://php.net/empty

    所以这会 总是 产生错误结果:

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

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

    当strpos在干草堆中找不到指针时,它将返回布尔值false,这是您要用三重相等运算符检查的内容,该运算符检查类型和值。查看比较运算符的文档

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

        2
  •  7
  •   Christian C. Salvadó    16 年前

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

    // 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"
    
        3
  •  5
  •   karim79    16 年前

    在PHP中!==表示类型和值不同。

    如果stripos()返回了除false以外的任何值(精确地说是'false',而不是零),这意味着它找到了一些东西,即使位置是0,并且返回了int(0)。0和false在与 = 但在使用身份时不会 = = 运算符,因此了解stripos()是否已找到某些确定内容的唯一方法是比较 的值和类型使用!==(不相同,即strpos()返回值的类型和值相同。)

        4
  •  5
  •   matpie    16 年前

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

    strpos() 返回false when 匹配。

    退房 comparison operators .

        5
  •  3
  •   OIS    16 年前

    不知道这样的东西是否更容易维护。取决于你是否在那些if条件下做了其他的事情。但您可以在配置文件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;
            }
        }
    }