2011-08-11 51 views
1

中掃描目錄時失敗我正在嘗試爲主文件夾中的每個目錄構建一個<ul>列表,並使用<li>。 這裏是我的代碼:is_dir()在php

<?php 

$dir = opendir(getEnv("DOCUMENT_ROOT") . "/folder"); 

while(($file = readdir($dir)) !== false){ 
    if(is_dir($file) && $file !== "." && $file !== ".."){ 
    echo "<li>" . $file . "</li>"; 
    } 
} 

closedir($dir); 

?> 

有在/ home /例子/文件夾兩個目錄,但也有不承認的文件夾(用於確保它們!)

,如果我「echo」中相應的文件while循環它們被打印出來(它們對於腳本來說不存在任何麻煩)。 如果我嘗試「filetype」他們,一個lstat failed錯誤被拋出,我在互聯網上搜索它的意義,我最終只有技術上的支持,我痛苦的理解。

回答

4

你的問題是在「文件夾」目錄下你可以有兩個目錄(a和b),然後讀取「a」和「b」作爲文件名,而is_dir接收完整路徑文件名或相對文件名,兩個選項:

  1. 將文件名的完整路徑傳遞給is_dir函數(請參閱示例代碼)。
  2. 傳遞相對路徑(取決於您放置腳本的位置)。
if(is_dir($dir . "/" . $file) && $file !== "." && $file !== ".."){ ...... 
+0

張貼起來,這是解除我的,非常感謝@fdaines – user544262772

0

嘗試:

while($file = readdir($dir)) { 
    if (...) { } 
} 

不是必需的!== false部。如果readdir到達最後,它將返回一個false,並且循環將自動終止。您的版本解析爲:

$file gets the value of (readdir($file) is not false) 

例如,您正在分配readdir($file) !== false的布爾結果,而不是來自readdir的返回值。


擴大在我下面的評論,有關operator precedence

PHP的你的循環設置的解析樹是這個樣子,擴大:

$bool = (readdir($dir) !== false); 
$file = $bool; 

爲了解決這個問題,要麼刪除= =完全假部分,或用額外括號強制執行您自己的優先級:

($file = readdir($dir)) !== false 
+0

我看不出什麼毛病我的病情,之前$文件的價值被比作'!== FALSE'分配進行處理。無論如何'!== false'只是用代碼更詳細的方式。這不能解決我的麻煩。爲什麼你發佈這個答案? – user544262772

+0

閱讀:http://php.net/manual/en/language.operators.precedence.php在PHP中,'='的優先級低於'==='和'!==',所以你的!==比較正在做第一。 –

+0

我已經知道,額外的括號出現在我的代碼中,你沒有看到它們嗎? – user544262772