我想知道如何将以下代码转换为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);
答案 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
和自定义过滤功能过滤掉您不想要的内容
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,尤其是RecursiveDirectoryIterator
和DirectoryIterator
。
答案 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
一样