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);