我在寻找的是如何构建一个函数,该函数将一个子文件夹循环遍历,并在目录层次结构中向后查找第一个匹配的文件指定。如何创建向后循环来查找第一个匹配的文件
例子是,我可以说我有目录结构: 主页/文件夹1 /文件夹2 /文件夹3
而我要找的文件style.css中。
我想开始指向子文件夹(文件夹3)并查找style.css,如果它不在那里,它会继续到父文件夹(文件夹2)等等。但它不应该比文件夹1更远。
如果有人有一个好主意该怎么做,我会非常感激!
我在寻找的是如何构建一个函数,该函数将一个子文件夹循环遍历,并在目录层次结构中向后查找第一个匹配的文件指定。如何创建向后循环来查找第一个匹配的文件
例子是,我可以说我有目录结构: 主页/文件夹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()在循环的每次迭代中删除数组的最后一个元素。然后你可以在路径上使用implode()把它放回到一个字符串中,这个字符串可以和file_exists()这样的文件函数一起使用。
非常感谢您的快速回答,这正是我一直在寻找的。 – 2010-10-23 14:36:29