Операторы PHP!= И ==

Это ошеломило меня на некоторое время. Я бегу по каталогу и прослеживаю его содержимое, и я хочу исключить ".." и "." файлы.

Теперь этот код работает:

if ($files = scandir("temp/"))
{
    foreach ($files as $file)
    {
        if ($file == ".." OR $file == ".")
        {
        }
        else {
            echo $file;
            echo "<br>";
        }
    }
}

Но это не...

if ($files = scandir("temp/"))
{
    foreach ($files as $file)
    {
        if ($file != ".." OR $file != ".")
        {
            echo $file;
            echo "<br>";
        }
    }
}

По понятным причинам второй кусок кода - это больше, чем я хочу, потому что я действительно ненавижу, когда истинное утверждение ничего не делает.

7 ответов

Если вы отменяете условие, состоящее из двух отдельных условий и соединения ("и" или "или"), вам необходимо отрицать каждое условие отдельно и использовать другое соединение.

Так что попробуйте это вместо:

if ($file != ".." AND $file != ".")

Это один из законов де Моргана.

not (A OR B) = (not A) AND (not B)

Внесенное вами изменение - это рефакторинг под названием Reverse Conditional

Они не противоположны...

Проверьте законы де Моргана.

if($file != ".." OR $file != ".")

должно быть

if($file != ".." AND $file != ".")

Вы должны отрицать все выражение, как -(-x + 2) в математике все отрицает

if ($file == ".." OR $file == ".")

Разве это не отрицание

if ($file != ".." OR $file != ".")

Потому что ты не отрицал ИЛИ. Противоположностью ИЛИ является И, в результате чего:

if ($file != ".." AND $file != ".")

$file != ".." оценивает как истинное. Вместо этого просто используйте оператор AND:

if ( $file != '..' && $file != '.' ) { }

Однако вместо этого я бы использовал DirectoryIterator:

foreach (new DirectoryIterator('temp') as $fileInfo) {
    if ($fileInfo->isDot())
        continue;
    echo $fileInfo->getFilename() . "<br>\n";
}

Кроме того, вы всегда можете использовать DirectoryIterator и, в частности, его метод isDot.

Это:

    if ($file != ".." OR $file != ".")

должно быть:

    if ($file != ".." && $file != ".")
Другие вопросы по тегам