Это немного озадачило меня. Я просматриваю каталог и эхо из его содержимого, и я хочу исключить «..» и «.». файлы.
Теперь этот код работает:
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 .