我写下了这个简单的函数,在一个数组上有dir和subdirs中存在的所有文件,但它不起作用。当我回声$f
时,没有任何东西在移动。
我哪里错了?
define('ROOT_DIR', __DIR__);
function scanSubDir($w_dir){
$dir = scandir($w_dir);
foreach($dir as $f){
if($f != '..' || $f != '.'){
if(is_file($w_dir.$f)){
$list[] = $f;
}elseif(is_dir($w_dir.$f)){
scanSubDir($w_dir.$f);
}
}
}
return $list;
}
$file = scanSubDir(ROOT_DIR.'/test/');
foreach($file as $f){
echo $f;
}
答案 0 :(得分:0)
修复代码:
function scanSubDir($w_dir){
$dir = scandir($w_dir);
$list = array(); // <-- create initially empty list of files
foreach($dir as $f){
if($f != '..' || $f != '.'){
if(is_file($dir.$f)){
$list[] = $f;
}elsif(is_dir($dir.$f)){
$sublist = scanSubDir($dir.PATH_SEPARATOR.$f); // <-- include path separator!
$list = array_merge($list, $sublist); // <-- merge the result of the recursive call
}
}
}
return $list;
}
请注意:
结果列表仅包含没有路径的文件名。你的情况可能还可以。例如,对于以下目录结构:
dir
|_ subdir
| |_ file.txt
| |_ file.jpg
|_ file.txt
结果将是:array('file.txt', 'file.jpg', 'file.txt')
(数组元素的顺序可能不同)。
请注意'file.txt'
来了两次,没有路径信息。
符号/硬链接可能会产生无限递归,导致堆栈溢出:) 如果您的目录应包含链接,您可能需要考虑这一点。
答案 1 :(得分:0)
试试这个:
<?php
function _scandir($dir = '.', $files = array())
{
foreach(glob($dir . '/*') as $file) {
if(is_file($file)) {
$files[] = $file;
}else{
$files = array_merge($files, _scandir($file));
}
}
return $files;
}
?>
<pre>
<?php print_r(_scandir()); ?>
</pre>