3

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.

1
  • 2
    You really need to choose an accepted answer on some your questions. Commented Jan 28, 2010 at 14:12

7 Answers 7

22

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 != ".")
Sign up to request clarification or add additional context in comments.

Comments

9

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

Comments

4

They're not opposites...

Check out de Morgan's laws.

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

should be

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

Comments

2

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

Comments

2

$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";
}

Comments

1

This:

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

should be:

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

Comments

1

Alternatively, you could always use DirectoryIterator and specifically its isDot method.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.