2009-11-02 116 views
3

这让我有些惊讶。我正在浏览一个目录并回显其内容,我想排除“..”和“。”。文件。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>"; 
     } 
    } 
} 

出于显而易见的原因代码的第二疙瘩更是我想要的,因为我真的很讨厌有真实的陈述什么也不做。

+2

你真的需要选择一个接受的答案对你的一些问题。 – 2010-01-28 14:12:36

回答

22

如果您否定由两个单一条件和一个连词(“和”或“或”)组成的条件,则需要单独否定每个条件并使用其他连接词。

那么试试这个来代替:

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

非常好,很好的解释。 – 2009-11-02 20:27:12

+5

德摩根法则+ 1年! http://en.wikipedia.org/wiki/De_Morgan%27s_laws – 2009-11-02 20:27:31

+0

呃......你显然可以接受这个;) – Franz 2009-11-02 20:55:54

1

此:

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

应该是:

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

你要否定整个表达式,就像-(-x + 2)数学否定一切

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

不是

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

因为你没有否定OR。 OR的相反是AND,导致:

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

$file != ".."的计算结果为true。只需使用AND运算符:

if ($file != '..' && $file != '.') { } 

不过,我会用DirectoryIterator代替:

foreach (new DirectoryIterator('temp') as $fileInfo) { 
    if ($fileInfo->isDot()) 
     continue; 
    echo $fileInfo->getFilename() . "<br>\n"; 
}