Операторы 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>"; } } } 

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

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

Поэтому попробуйте это вместо этого:

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

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

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

Изменение, которое вы делаете, это рефакторинг под названием « Обратный условный

Они не противоположности …

Ознакомьтесь с законами Моргана.

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

должно быть

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

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

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

Не отрицание

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

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

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

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

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

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

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

Эта:

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

должно быть:

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

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