Зачем использовать! == ЛОЖЬ, чтобы проверить полосы в php? - PullRequest
17 голосов
/ 31 марта 2009

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

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 ]

49 голосов
/ 31 марта 2009

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

http://php.net/empty

Так что всегда даст неверные результаты:

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

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

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

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

7 голосов
/ 31 марта 2009

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"
5 голосов
/ 31 марта 2009

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

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

5 голосов
/ 31 марта 2009

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

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

Проверьте операторы сравнения .

3 голосов
/ 31 марта 2009

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