You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含多个%%%ANY_DIR%%%的路径模板生成所有文件夹路径

解决多占位符目录路径生成问题

问题概述

需要从包含多个%%%ANY_DIR%%%占位符的路径模板中,生成所有可能的实际文件夹路径,每个占位符对应其所在层级下的所有实际子目录。模板示例:

$multiple_folder_scan_structure = "Customers/%%%ANY_DIR%%%/HW/%%%ANY_DIR%%%/XR7 and XR7 plus (7702 and 7703)";

核心思路

采用迭代扩展的方式处理路径模板:

  1. 将路径模板按/拆分为分段列表
  2. 维护一个当前路径集合,初始为空,逐步处理每个分段:
    • 若为固定分段,直接追加到所有现有路径后
    • 若为%%%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;
}

代码说明

  1. 分段处理:将模板拆分为单个目录段,逐个处理,确保每一步的路径都是有效的
  2. 动态扩展:遇到占位符时,对每个现有路径扫描子目录,生成新的路径组合,自然处理多占位符的排列组合
  3. 路径格式化:使用rtrim和ltrim避免路径中出现多余的斜杠,保证路径格式统一
  4. 前缀添加:最后统一添加示例中的../../前缀,可根据实际需求调整

原代码问题分析

你之前的代码仅将扫描到的目录存入数组,但未将这些目录与已有的路径进行组合,导致无法生成完整的路径排列。上述迭代扩展的方式,每一步都基于现有路径生成新的路径集合,完美解决多占位符的组合问题。

内容的提问来源于stack exchange,提问作者Jiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:22:06