Зачем использовать! == 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)) , но почему это так?

Ответ заключается в том, что в PHP значение «false» может удовлетворяться несколькими значениями, такими как пустой массив, пустая строка, NULL, целое число 0 и т. Д. См. Страницу функций empty () для полного списка:

http://php.net/empty

Таким образом, это всегда приводило бы к неправильным результатам:

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

Так как «а» встречается в первой позиции (индекс 0), то PHP считает, что «if (0)» является ложным.

Когда strpos НЕ находит иглу в стоге сена, она возвращает логическое FALSE, что вы хотите проверить с помощью оператора тройного равенства, который проверяет тип и значение. См. Документы по операторам сравнения

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

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" 

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

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

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

strpos() возвращает false при обнаружении соответствия NO .

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

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