PHP: читать скандир? - PullRequest
       6

PHP: читать скандир?

2 голосов
/ 13 июля 2010

Интересно, как я могу преобразовать следующий фрагмент кода в 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 ]

2 голосов
/ 13 июля 2010

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 получаете массив.
1 голос
/ 13 июля 2010

Чтобы начать работу с такими проблемами, всегда обращайтесь к руководству по 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.

1 голос
/ 13 июля 2010

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

$path = 'files';
$files = array();
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot() || $fileInfo->getFilename() == 'Thumbs.db') continue;
    $files[] = $fileInfo->getFilename();
}
shuffle($files);
0 голосов
/ 18 октября 2017

Вот небольшая функция для сканирования каталога без получения надоедливых файлов.

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 делает

...