Операторы 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 != ".")