2009-10-06 3 views
2

Я кодирую простую систему веб-отчетов для своей компании. Я написал сценарий для index.php, который получает список файлов в каталоге «reports» и автоматически создает ссылку на этот отчет. Он работает нормально, но моя проблема здесь в том, что readdir() продолжает возвращать. и .. указатели каталога в дополнение к содержимому каталога. Есть ли способ предотвратить этот ДРУГОЙ, ЧЕМ цикл через возвращенный массив и удалить их вручную?PHP readdir() возвращает записи «.» И «..»

Вот соответствующий код для любознательных:

//Open the "reports" directory 
$reportDir = opendir('reports'); 

//Loop through each file 
while (false !== ($report = readdir($reportDir))) 
{ 
    //Convert the filename to a proper title format 
    $reportTitle = str_replace(array('_', '.php'), array(' ', ''), $report); 
    $reportTitle = strtolower($reportTitle); 
    $reportTitle = ucwords($reportTitle); 

    //Output link 
    echo "<a href=\"viewreport.php?" . $report . "\">$reportTitle</a><br />"; 
} 

//Close the directory 
closedir($reportDir); 

ответ

14

В вашем коде выше, вы могли бы добавить в качестве первой линии в петле while :

if ($report == '.' or $report == '..') continue; 
+0

достаточно простое решение. Я надеялся, что, возможно, есть опция параметра readdir, чтобы избежать этого, но я думаю, что нет. Этот вопрос получил около 5 одновременных ответов с почти таким же точным решением. Принимая это, потому что это было первым. – DWilliams

+0

приятный и чистый пример +1 – Andrew

4
array_diff(scandir($reportDir), array('.', '..')) 

или даже лучше:

foreach(glob($dir.'*.php') as $file) { 
    # do your thing 
} 
1

Я не знаю другого пути, как "." и ".." являются надлежащими каталогами. Поскольку вы все равно зацикливаете на формирование правильного URL-адреса отчета, вы можете просто добавить немного if, который игнорирует . и .. для дальнейшей обработки.

EDIT
Пол Lammertsma был немного быстрее, чем у меня. Это решение, которое вы хотите ;-)

2

Нет, эти файлы принадлежат каталогу, и readdir должен таким образом вернуть их. Я бы счел, что любое другое поведение будет нарушено.

Во всяком случае, просто пропустите их:

while (false !== ($report = readdir($reportDir))) 
{ 
    if (($report == ".") || ($report == "..")) 
    { 
    continue; 
    } 
    ... 
}