Зачем использовать! == FALSE, чтобы проверить stripos в php?

Вот код, на который я смотрю.

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)), но почему так оно происходит?

Ответы

Ответ 1

Ответ заключается в том, что в PHP значение "false" может удовлетворяться несколькими значениями, такими как пустой массив, пустая строка, NULL, целое число 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

stripos возвращает позицию строки внутри другой, и если строка не найдена, она возвращает false, поэтому она рекомендовала используйте идентификаторы операторов сравнения (===,! ==), потому что 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"

Ответ 3

Потому что, если строка, совпадающая с позицией 0, 0, принимает значение false, поэтому вы должны добавить дополнительный '=', чтобы этот тип был принят для рассмотрения.

strpos() возвращает false, когда найдено соответствие NO.

Откажитесь от операторов сравнения.

Ответ 4

В PHP, == == означает не одно и то же значение типа И.

Если stripos() возвращает что-либо иное, кроме false (и точно "false", а не ноль), это означает, что оно что-то нашло, даже если позиция равна 0 и возвращается int (0). 0 и false равны при выполнении стандартного сравнения с ==, но не при использовании идентификатора ===, поэтому единственный способ узнать, имеет ли stripos() найти что-то наверняка, это сравнить false значение и тип с помощью! == (не идентичны, то есть одного и того же типа и значения возвращаемого значения strpos().)

Ответ 5

Не знаю, если что-то вроде этого будет легче поддерживать. Зависит, если вы выполняете что-то еще в тех условиях 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;
        }
    }
}