PHP: переадресовывать в скандир?
Интересно, как я могу точно преобразовать следующий фрагмент кода в scandir
вместо readdir
?
$path = 'files';
//shuffle files
$count = 0;
if ($handle = opendir($path)) {
$retval = array();
while (false !== ($file = readdir($handle))) {
$ext = pathinfo($file, PATHINFO_EXTENSION);
if ($file != '.' && $file != '..' && $file != '.DS_Store' &&
$file != 'Thumbs.db') {
$retval[$count] = $file;
$count = $count + 1;
} else {
//no proper file
}
}
closedir($handle);
}
shuffle($retval);
4 answers
scandir
возвращает, цитируя :
Возвращает массив имен файлов при успешном выполнении или FALSE при сбое.
Это означает, что вы получите полный список файлов в каталоге, а затем сможете отфильтровать их, используя либо пользовательский цикл с foreach
, либо какую-либо функцию фильтрации, например array_filter
.
Не проверено, но я полагаю, что-то вроде этого должно сработать:
$path = 'files';
if (($retval = scandir($path)) !== false) {
$retval = array_filter($retval, 'filter_files');
shuffle($retval);
}
function filter_files($file) {
return ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'Thumbs.db');
}
В основном, здесь:
- Во-первых, вы получаете список файлов, используя
scandir
- Затем вы отфильтровываете те, которые вам не нужны, используя
array_filter
и пользовательскую функцию фильтрации- Примечание: эта пользовательская функция фильтрации могла быть написана с использованием анонимной функции с PHP>=5.3
- И, наконец, вы
shuffle
результирующий массив.
Не уверен, почему вы хотите это сделать, но вот гораздо более краткое решение:
$path = 'files';
$files = array();
foreach (new DirectoryIterator($path) as $fileInfo) {
if($fileInfo->isDot() || $fileInfo->getFilename() == 'Thumbs.db') continue;
$files[] = $fileInfo->getFilename();
}
shuffle($files);
Чтобы начать работу с такими проблемами, всегда обращайтесь к руководству по PHP и читайте комментарии, это всегда очень полезно. В нем говорится, что scandir
возвращает массив, поэтому вы можете пройти по нему с foreach
.
Для того, чтобы иметь возможность удалять некоторые записи массива, вот пример с for
:
$exclude = array( ".", "..", ".DS_Store", "Thumbs.db" );
if( ($dir = scandir($path)) !== false ) {
for( $i=0; $i<count($dir); $i++ ) {
if( in_array($dir[$i], $exclude) )
unset( $dir[$i] );
}
}
$retval = array_values( $dir );
Также взгляните на Итераторы SPL, предоставляемые PHP, особенно RecursiveDirectoryIterator
и DirectoryIterator
.
Вот небольшая функция для сканирования каталога без получения раздражающих файлов.
function cleanscandir ($dir) {
$list = [];
$junk = array('.', '..', 'Thumbs.db', '.DS_Store');
if (($rawList = scandir($dir)) !== false) {
foreach (array_diff($rawList, $junk) as $value) {
$list[] = $value;
}
return $list;
}
return false;
}
Выводит массив или значение false точно так же, как scandir
выводит