PHP != and == operators
This has boggled me for a while. I am running through a directory and echo'ing out its contents, and I want to exclude the ".." and "."开发者_JAVA技巧 files.
Now, this code works:
if ($files = scandir("temp/"))
{
foreach ($files as $file)
{
if ($file == ".." OR $file == ".")
{
}
else {
echo $file;
echo "<br>";
}
}
}
But this doesn't...
if ($files = scandir("temp/"))
{
foreach ($files as $file)
{
if ($file != ".." OR $file != ".")
{
echo $file;
echo "<br>";
}
}
}
For obvious reasons the second lump of code is more what I want, because I really hate having the true statement do nothing.
If you negate a condition consisting of two single conditions and a conjunction ("and" or "or"), you need to negate each condition separately and use the other conjunction.
So try this instead:
if ($file != ".." AND $file != ".")
This is one of deMorgan's Laws.
not (A OR B) = (not A) AND (not B)
The change you are making is a refactoring called Reverse Conditional
They're not opposites...
Check out de Morgan's laws.
if($file != ".." OR $file != ".")
should be
if($file != ".." AND $file != ".")
You have to negate the entire expression, just like -(-x + 2)
in math negates everything:
if ($file == ".." OR $file == ".")
Is not the negation of
if ($file != ".." OR $file != ".")
Because you didn't negate the OR. The opposite of OR is AND, resulting a:
if ($file != ".." AND $file != ".")
$file != ".."
evaluates to true. Instead, simply use an AND operator:
if ( $file != '..' && $file != '.' ) { }
However, I would use DirectoryIterator instead:
foreach (new DirectoryIterator('temp') as $fileInfo) {
if ($fileInfo->isDot())
continue;
echo $fileInfo->getFilename() . "<br>\n";
}
This:
if ($file != ".." OR $file != ".")
should be:
if ($file != ".." && $file != ".")
Alternatively, you could always use DirectoryIterator and specifically its isDot method.
精彩评论