PHP:readdir到scandir?

时间:2010-07-13 10:00:07

标签: php readdir scandir

我想知道如何将以下代码转换为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 个答案:

答案 0 :(得分:2)

scandir返回,quoting

  

返回文件名数组   成功,或失败时为假。

这意味着您将获得目录中的完整文件列表 - 然后可以使用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 :(得分:1)

不确定为什么要这样做,这是一个更简洁的解决方案:

$path = 'files';
$files = array();
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot() || $fileInfo->getFilename() == 'Thumbs.db') continue;
    $files[] = $fileInfo->getFilename();
}
shuffle($files);

答案 2 :(得分: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 iterators,尤其是RecursiveDirectoryIteratorDirectoryIterator

答案 3 :(得分: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;
}

输出数组或假,就像scandir一样