如何基于含多个%%%ANY_DIR%%%的路径模板生成所有文件夹路径
解决多占位符目录路径生成问题
问题概述
需要从包含多个%%%ANY_DIR%%%占位符的路径模板中,生成所有可能的实际文件夹路径,每个占位符对应其所在层级下的所有实际子目录。模板示例:
$multiple_folder_scan_structure = "Customers/%%%ANY_DIR%%%/HW/%%%ANY_DIR%%%/XR7 and XR7 plus (7702 and 7703)";
核心思路
采用迭代扩展的方式处理路径模板:
- 将路径模板按
/拆分为分段列表 - 维护一个当前路径集合,初始为空,逐步处理每个分段:
- 若为固定分段,直接追加到所有现有路径后
- 若为
%%%ANY_DIR%%%,则扫描当前路径下的所有子目录,将每个子目录与现有路径拼接,生成新的路径集合
实现代码
假设scan_dir_sorted函数返回指定目录下的所有子目录(排除.和..),以下是完整实现:
function generateAllPaths($template) { $segments = explode('/', $template); $currentPaths = ['']; // 初始路径为空字符串 foreach ($segments as $segment) { $newPaths = []; if ($segment === '%%%ANY_DIR%%%') { // 处理动态目录占位符:扫描每个当前路径下的子目录 foreach ($currentPaths as $path) { // 确保路径存在才扫描 if (is_dir($path)) { foreach (scan_dir_sorted($path) as $subDir) { // 拼接新路径,避免开头/结尾多余的斜杠 $newPath = rtrim($path, '/') . '/' . $subDir; $newPaths[] = $newPath; } } } } else { // 处理固定分段:直接追加到所有当前路径后 foreach ($currentPaths as $path) { $newPath = rtrim($path, '/') . '/' . $segment; $newPaths[] = $newPath; } } // 更新当前路径集合为新生成的路径 $currentPaths = $newPaths; } // 可选:给所有路径添加前缀(比如示例中的../../) $prefix = '../../'; return array_map(function($path) use ($prefix) { return $prefix . ltrim($path, '/'); }, $currentPaths); } // 使用示例 $template = "Customers/%%%ANY_DIR%%%/HW/%%%ANY_DIR%%%/XR7 and XR7 plus (7702 and 7703)"; $allPaths = generateAllPaths($template); // 输出结果 foreach ($allPaths as $path) { echo $path . PHP_EOL; }
代码说明
- 分段处理:将模板拆分为单个目录段,逐个处理,确保每一步的路径都是有效的
- 动态扩展:遇到占位符时,对每个现有路径扫描子目录,生成新的路径组合,自然处理多占位符的排列组合
- 路径格式化:使用
rtrim和ltrim避免路径中出现多余的斜杠,保证路径格式统一 - 前缀添加:最后统一添加示例中的
../../前缀,可根据实际需求调整
原代码问题分析
你之前的代码仅将扫描到的目录存入数组,但未将这些目录与已有的路径进行组合,导致无法生成完整的路径排列。上述迭代扩展的方式,每一步都基于现有路径生成新的路径集合,完美解决多占位符的组合问题。
内容的提问来源于stack exchange,提问作者Jiri
相关产品推荐
相关产品推荐

