PHP: с помощью scandir() папки обрабатываются как файлы

Использование PHP 5.3.3 (стабильный) в Linux CentOS 5.5.

Вот моя структура папок:

www/myFolder/
www/myFolder/testFolder/
www/myFolder/testFile.txt

Используя scandir() для папки "myFolder", я получаю следующие результаты:

.
..
testFolder
testFile.txt

Я пытаюсь отфильтровать папки из результатов и вернуть только файлы:

$scan = scandir('myFolder');

foreach($scan as $file)
{
    if (!is_dir($file))
    {
        echo $file.'\n';
    }
}

Ожидаемые результаты:

testFile.txt

Однако я на самом деле вижу:

testFile.txt
testFolder

Может кто-нибудь сказать мне, что здесь происходит, пожалуйста?

5 ответов

Решение

Вам нужно изменить каталог или добавить его в свой тест. is_dir возвращает false, когда файл не существует.

$scan = scandir('myFolder');

foreach($scan as $file)
{
    if (!is_dir("myFolder/$file"))
    {
        echo $file.'\n';
    }
}

Это должно делать правильно

Уже сказал вам ответ здесь: http://bugs.php.net/bug.php?id=52471

Разве is_dir() не принимает файл в качестве параметра?

$scan = scandir('myFolder');

foreach($scan as $file)
{
    if (!is_dir($file))
    {
        echo $file.'\n';
    }
}

Если бы вы отображали ошибки, вы бы увидели, почему это не работает:

Warning: Wrong parameter count for is_dir() in testFile.php on line 16

Теперь попробуйте передать $file is_dir()

$scan = scandir('myFolder'); 

foreach($scan as $file) 
{ 
    if (!is_dir($file)) 
    { 
        echo $file.'\n'; 
    } 
} 

Если кто-то, кто приходит сюда, заинтересован в сохранении вывода в массив, вот быстрый способ сделать это (модифицированный, чтобы быть более эффективным:

$dirPath = 'dashboard';

$dir = scandir($dirPath);

foreach($dir as $index => &$item)
{
    if(is_dir($dirPath. '/' . $item))
    {
        unset($dir[$index]);
    }
}

$dir = array_values($dir);
Другие вопросы по тегам