我有这个工作函数,可以找到文件夹并创建一个数组。
function dua_get_files($path)
{
foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename)
{
$dir_paths[] = $filename;
}
return $dir_paths;
}
此功能只能查找当前位置的目录。我想在子文件夹及其子文件夹中找到目录路径,等等。
数组应该仍然是目录路径的平面列表。
输出数组应如何显示的示例
$dir_path[0] = 'path/folder1';
$dir_path[1] = 'path/folder1/child_folder1';
$dir_path[2] = 'path/folder1/child_folder2';
$dir_path[3] = 'path/folder2';
$dir_path[4] = 'path/folder2/child_folder1';
$dir_path[5] = 'path/folder2/child_folder2';
$dir_path[6] = 'path/folder2/child_folder3';
答案 0 :(得分:18)
如果你想以递归方式处理目录,你应该看一下RecursiveDirectoryIterator
。
$path = realpath('/etc');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
echo "$name\n";
}
答案 1 :(得分:5)
请改为尝试:
function dua_get_files($path)
{
$data = array();
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file)
{
if (is_dir($file) === true)
{
$data[] = strval($file);
}
}
return $data;
}
答案 2 :(得分:4)
使用此功能:
function dua_get_files($path)
{
$dir_paths = array();
foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename)
{
$dir_paths[] = $filename;
$a = glob("$filename/*", GLOB_ONLYDIR);
if( is_array( $a ) )
{
$b = dua_get_files( "$filename/*" );
foreach( $b as $c )
{
$dir_paths[] = $c;
}
}
}
return $dir_paths;
}
答案 3 :(得分:4)
非常奇怪 - 每个人都建议递归,但更好的只是循环:
$dir ='/dir';
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) {
$dir .= '/*';
if(!$result) {
$result = $dirs;
} else {
$result = array_merge($result, $dirs);
}
}
答案 4 :(得分:1)
您可以使用php GLOB函数,但必须创建一个递归函数来扫描无限级别深度的目录。然后将结果存储在全局变量中。
function dua_get_files($path) {
global $dir_paths; //global variable where to store the result
foreach ($path as $dir) { //loop the input
$dir_paths[] = $dir; //can use also "basename($dir)" or "realpath($dir)"
$subdir = glob($dir . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR); //use DIRECTORY_SEPARATOR to be OS independent
if (!empty($subdir)) { //if subdir is not empty make function recursive
dua_get_files($subdir); //execute the function again with current subdir
}
}
}
//usage:
$path = array('galleries'); //suport absolute or relative path. support one or multiple path
dua_get_files($path);
print('<pre>'.print_r($dir_paths,true).'</pre>'); //debug
答案 5 :(得分:-1)
对于 PHP ,如果您使用的是linux / unix,则还可以使用反引号(shell执行)和unix find
命令。在文件系统上进行目录搜索可能需要很长时间并且可以进行循环 - 系统find
命令已经构建用于速度和处理文件系统循环。换句话说,系统exec调用可能比使用PHP本身搜索文件系统树花费更少的CPU时间。
$dirs = `find $path -type d`;
请记住清理$ path输入,以便其他用户不会传递安全危害路径名称(例如来自url或其他内容)。
将其放入数组
$dirs = preg_split("/\s*\n+\s*/",`find $path -type d`,-1,PREG_SPLIT_NO_EMPTY);