tags:

views:

165

answers:

9

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 "." 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.

Thanks for any help.

+20  A: 

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 != ".")

Hope this makes sense - not a native speaker ;)

Franz
Excellent, good explanation.
C. Ross
+1 yay for DeMorgan's Law! http://en.wikipedia.org/wiki/De_Morgan%27s_laws
Dave DeLong
Ahem... you can obviously accept this ;)
Franz
A: 

The second snippet is just plain wrong logic. The first example is correct.

spoulson
Downmod me if you know I'm wrong... I dare ya!
spoulson
+4  A: 

They're not opposites...

Check out de Morgan's laws.

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

should be

if($file != ".." AND $file != ".")
Austin Salonen
+1  A: 

this:

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

should be:

    if($file != ".." && $file != ".")
schneck
+2  A: 

You have the 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 != ".")
LiraNuna
+2  A: 

$file!=".." evaluates to true, 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";
}
meder
+7  A: 

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

Ewan Todd
A: 

Ah yes, I should know this considering I just finished studying DeMorgan in Electronics with logic gates, seems I have some catching up to do ;) Thanks guys.

Whitey
This is really more of a comment and be sure to accept an answer.
Austin Salonen
+1  A: 

Alternatively, you could always use DirectoryIterator and specifically it's isDot method.

Peter Bailey