2010-10-20 26 views
4

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

例子是,我可以说我有目录结构: 主页/文件夹1 /文件夹2 /文件夹3

而我要找的文件style.css中。

我想开始指向子文件夹(文件夹3)并查找style.css,如果它不在那里,它会继续到父文件夹(文件夹2)等等。但它不应该比文件夹1更远。

如果有人有一个好主意该怎么做,我会非常感激!

回答

3

一个快速和肮脏的方法是:

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); 
+0

非常感谢您的快速回答,这正是我一直在寻找的。 – 2010-10-23 14:36:29

0

这是一个简单的递归功能(你有可能的迭代数量有限,所以不会有太大的开销)。中的伪码是这样的:

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

对于拳头答案的进一步说明:当在PHP路径工作,可以很方便地爆炸()的路径中,以阵列。如果它们位于数组中,则使用路径更容易。在这种情况下,您可以使用array_pop()在循环的每次迭代中删除数组的最后一个元素。然后你可以在路径上使用implode()把它放回到一个字符串中,这个字符串可以和file_exists()这样的文件函数一起使用。

相关问题