【问题标题】:php function to search paths for filename WITHOUT extensionphp函数搜索文件名的路径,没有扩展名
【发布时间】:2015-06-06 12:01:02
【问题描述】:

是的,所以我正在制作一个配置类,它将在 4 个主要位置使用不同文件类型的数组。现在我想让配置类在我使用以下命令时按顺序搜索这些位置

if (file_exists(ROOT . DS . 'Application/Config/' . APP_ENV . DS . $file)) {
        $this->filePath = ROOT . DS . 'Application/Config/' . APP_ENV . DS . $file;
        echo $this->filePath;
    } else {
        if (file_exists(ROOT . DS . "Application/Config/$file")) {
            $this->filePath = ROOT . DS . "Application/Config/$file";
            echo $this->filePath;
        } else {
            if (file_exists(CARBON_PATH . 'Config' . DS . APP_ENV . DS . $file)) {
                $this->filePath = CARBON_PATH . 'Config' . DS . APP_ENV . DS . $file;
                echo $this->filePath;
            } else {
                if (file_exists(CARBON_PATH . "Config/$file")) {
                    $this->filePath = CARBON_PATH . "Config/$file";
                    echo $this->filePath;
                } else {
                    throw new \Exception("Unable to locate: $file, Please check it exists");
                }
            }
        }
    }

相当凌乱,不是很灵活。

我想要做的是仅在找到第一个匹配项后按文件名按相同顺序搜索位置然后返回带有配置类扩展名的文件,以使用正确的方法解析为php数组等等。

在这些位置搜索文件名的最佳方法是什么

示例 假设我们想要一个数据库配置文件,你可以看到有 2 个

ConfigLocation1/Dev/
   /file.php
   /database.json
ConfigLocation1/
   /database.ini
   /anotherfile.json

我想像这样使用函数

config::findFile('database');

然后它返回

$result = ConfigLocation1/Dev/database.json

如果这里没有找到,那么

$result = ConfigLocation1/database.ini

不太擅长解释事情,所以希望这个例子对你有帮助

【问题讨论】:

    标签: php string file preg-match


    【解决方案1】:

    正如您提到的,您需要在 4 个位置检查文件,因此创建一个目录数组并循环遍历而不是 if 条件。

    您可以使用glob 来查找文件,而无需考虑扩展名。请参阅下面的示例:-

    //Make a array of directory where you want to look for files.
    $dirs = array(
        ROOT . DS . 'Application/Config/' . APP_ENV . DS,
        CARBON_PATH . 'Config' . DS . APP_ENV . DS
    );
    
    function findFiles($directory, $filename){
        $match = array();
    
        foreach ($directory => $dir) {
            $files = glob($dir.$filename);
            foreach ($files as $file) {
                 $match[] = $file;
            }
    
        }
    
        return $match;
    } 
    
    // to find database
    $results = findFiles($dirs, 'database.*');
    

    【讨论】:

    • 感谢您的 glob()。假设这将返回数组中的所有结果,我是否正确?我如何在其中添加一个中断,以便它停止找到第一个项目,因为您希望优先返回应用程序文件而不是核心文件
    • 是的,如果找到结果,它将返回数组,更多信息请参见glob,如果您只需要一次匹配,则返回匹配,如果目录数组有,break 将查找下一个目录
    • 你不需要在foreach之前测试一个变量是否为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多