2

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

4 に答える 4

2

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、結果の配列を取得します。
于 2010-07-13T10:14:34.853 に答える
1

なぜそれをしたいのかわかりませんが、もっと簡潔な解決策があります:

$path = 'files';
$files = array();
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot() || $fileInfo->getFilename() == 'Thumbs.db') continue;
    $files[] = $fileInfo->getFilename();
}
shuffle($files);
于 2010-07-13T10:12:17.777 に答える
1

このような問題を始めるには、常に 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 );

また、PHP が提供するSPL イテレータRecursiveDirectoryIterator、特にと を見てくださいDirectoryIterator

于 2010-07-13T10:18:05.380 に答える
0

迷惑なファイルを取得せずにディレクトリをスキャンする小さな関数を次に示します。

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します

于 2017-10-18T08:22:08.080 に答える