Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何创建反向循环以查找第一个匹配文件_Php_Loops_Directory - Fatal编程技术网

Php 如何创建反向循环以查找第一个匹配文件

Php 如何创建反向循环以查找第一个匹配文件,php,loops,directory,Php,Loops,Directory,我要寻找的是一个如何构建一个函数,该函数通过一个子文件夹在目录层次结构中循环并向后查找指定的第一个匹配文件 例如,我假设我有目录结构: 主/文件夹1/文件夹2/文件夹3 我正在寻找style.css文件 我想开始指向子文件夹(文件夹3)并查找style.css,如果它不在那里,它将继续指向父文件夹(文件夹2),依此类推。但它不应该追溯到文件夹1之前 如果有人知道怎么做,我将非常感激 快速而肮脏的方法是: function traverse_backward($filename, $path, $

我要寻找的是一个如何构建一个函数,该函数通过一个子文件夹在目录层次结构中循环并向后查找指定的第一个匹配文件

例如,我假设我有目录结构: 主/文件夹1/文件夹2/文件夹3

我正在寻找style.css文件

我想开始指向子文件夹(文件夹3)并查找style.css,如果它不在那里,它将继续指向父文件夹(文件夹2),依此类推。但它不应该追溯到文件夹1之前


如果有人知道怎么做,我将非常感激

快速而肮脏的方法是:

function traverse_backward($filename, $path, $min_depth) {
    // $path = '/home/user/projects/project1/static/css/'; 
    // $min_depth - the minimum level of the path;
    // $filename - the file name you are looking for, e.g. 'style.css'
    $path_parts = explode('/',$path);
    while (count($path_parts) > $min_depth) {
       $real_path = implode($path_parts,'/').'/';
       if (is_file($real_path.$filename)) {
          return $real_path;
       }
       array_pop($path_parts);
    }

    return false;
}
traverse_backward('t.php', '/home/user/projects/test-www/static/css', 3);

这是一个简单的递归函数(可能的迭代次数有限,因此不会有太多开销)。伪代码如下所示:

function lookForCss($from) {
  if(from contains css file) {
    return $from;
  }
  //else 
  $from = go up one folder($from);
  return lookForCss($from);
}

对第一个答案的进一步解释:在PHP中使用路径时,将路径分解为数组非常方便。如果路径位于一个数组中,则更容易使用它们。在本例中,使用array_pop()在循环的每次迭代中删除数组的最后一个元素。然后,您可以在路径上使用内爆()将其放回字符串中,该字符串可以与文件函数一起使用,例如us file_exists()。

非常感谢您的快速回答,这正是我想要的。