如何使用 glob 创建子目录数组
How to create subdirectory arrays with glob
我的目录结构如下:
MainFolder
Folder1
Folder1-1
Folder1-1-1
Folder1-1-2
Folder1-1-3
Folder1-2
Folder1-2-1
Folder1-2-2
Folder1-2-3
Folder2
Folder2-1
Folder2-1-1
Folder2-1-2
Folder2-1-3
Folder2-2
Folder2-2-1
Folder2-2-2
Folder2-2-3
我正在尝试创建 3 个数组
1 - MainFolder 的所有子文件夹的数组(Folder1、Folder2..等)
2 - Folder1、Folder2 等内部的子文件夹数组(例如:Folder1-1...folder2-1...)
3 - Folder1-1...、Folder1-2... 等中的子文件夹数组
这样我只能过滤当前目录的子目录:
//path to directory to scan
$directory = "MainFolder/";
//get all files in specified directory
$files = glob($directory . "*");
//print each file name
foreach($files as $file)
{
//check to see if the file is a folder/directory
if(is_dir($file))
{
echo $file;
}
}
但是如何让 glob 过滤当前目录并自动分组到数组中,就像我在示例中展示的那样?
我已经看到 RecursiveDirectoryIterator
存在,但我不明白如何将它放在不同的数组中
将您的代码放入一个函数中,以便您可以在特定级别为每个目录调用它。
function all_subdirectories($directory) {
$files = glob("$directory/*");
return array_filter($files, 'is_dir');
}
以下代码将创建每个级别的二维数组。
$all_levels = array();
$dirs = array("MainFolder");
while (!empty($dirs)) {
$next_level = array();
foreach ($dirs as $dir) {
$next_level += all_subdirectories($dir);
}
if (!empty($next_level)) {
$all_levels[] = array_map('basename', $next_level);
}
$dirs = $next_level;
}
print_r($all_levels);
只需要 3 个级别就更简单了:
$level1 = all_subdirectories("MainFolder");
$level2 = all_subdirectories("MainFolder/*");
$level3 = all_subdirectories("MainFolder/*/*");
你有一个固定的低深度,所以你真的不需要递归恕我直言。
您可以使用通配符 * 来标记不同的级别和 GLOB_ONLYDIR 来仅检索文件夹:
$level1 = glob('MainFolder/*', GLOB_ONLYDIR);
$level2 = glob('MainFolder/*/*', GLOB_ONLYDIR);
$level3 = glob('MainFolder/*/*/*', GLOB_ONLYDIR);
如果您想存储最后一个文件夹而不是完整路径,您可以使用 array_map() 和 basename() :
$level1 = array_map('basename', glob('MainFolder/*', GLOB_ONLYDIR));
...
我的目录结构如下:
MainFolder
Folder1
Folder1-1
Folder1-1-1
Folder1-1-2
Folder1-1-3
Folder1-2
Folder1-2-1
Folder1-2-2
Folder1-2-3
Folder2
Folder2-1
Folder2-1-1
Folder2-1-2
Folder2-1-3
Folder2-2
Folder2-2-1
Folder2-2-2
Folder2-2-3
我正在尝试创建 3 个数组
1 - MainFolder 的所有子文件夹的数组(Folder1、Folder2..等)
2 - Folder1、Folder2 等内部的子文件夹数组(例如:Folder1-1...folder2-1...)
3 - Folder1-1...、Folder1-2... 等中的子文件夹数组
这样我只能过滤当前目录的子目录:
//path to directory to scan
$directory = "MainFolder/";
//get all files in specified directory
$files = glob($directory . "*");
//print each file name
foreach($files as $file)
{
//check to see if the file is a folder/directory
if(is_dir($file))
{
echo $file;
}
}
但是如何让 glob 过滤当前目录并自动分组到数组中,就像我在示例中展示的那样?
我已经看到 RecursiveDirectoryIterator
存在,但我不明白如何将它放在不同的数组中
将您的代码放入一个函数中,以便您可以在特定级别为每个目录调用它。
function all_subdirectories($directory) {
$files = glob("$directory/*");
return array_filter($files, 'is_dir');
}
以下代码将创建每个级别的二维数组。
$all_levels = array();
$dirs = array("MainFolder");
while (!empty($dirs)) {
$next_level = array();
foreach ($dirs as $dir) {
$next_level += all_subdirectories($dir);
}
if (!empty($next_level)) {
$all_levels[] = array_map('basename', $next_level);
}
$dirs = $next_level;
}
print_r($all_levels);
只需要 3 个级别就更简单了:
$level1 = all_subdirectories("MainFolder");
$level2 = all_subdirectories("MainFolder/*");
$level3 = all_subdirectories("MainFolder/*/*");
你有一个固定的低深度,所以你真的不需要递归恕我直言。
您可以使用通配符 * 来标记不同的级别和 GLOB_ONLYDIR 来仅检索文件夹:
$level1 = glob('MainFolder/*', GLOB_ONLYDIR);
$level2 = glob('MainFolder/*/*', GLOB_ONLYDIR);
$level3 = glob('MainFolder/*/*/*', GLOB_ONLYDIR);
如果您想存储最后一个文件夹而不是完整路径,您可以使用 array_map() 和 basename() :
$level1 = array_map('basename', glob('MainFolder/*', GLOB_ONLYDIR));
...