Зачем использовать! == 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;
}
}
}