2016-02-26 26 views
0

我要让脚本来搜索多个目录中的一个文件,例如我有目录的结构:PHP - 超过1个目录搜索文件

-images 
    --2014 
    --2015 
    --2016 

现在我的PHP脚本应搜索文件。 JPG中的2014/2015/2016(文件夹一个将被动态创建,所以我不能把文件夹列表中的脚本(只是文件夹“图片”将是永远)。

最好的问候!

+1

到目前为止尝试过哪些方法? –

+2

[PHP读取子目录和循环文件如何?]的可能重复(http://stackoverflow.com/questions/2014474/php-read-sub-directories-and-loop-through-files-how-to ) – mitkosoft

回答

0

你只能使用​​3210。
在精确的情况下,你描述它应该是这样的:

$files = glob('path_to_images/*/FILE.jpg'); 

更一般地,需要已知的文件夹路径和搜索文件名之间探索出一条给定的深度级别把尽可能多的/*


编辑,根据OP的评论

如果你不知道树结构什么,你可以做一次深层的多层次的搜索,这样延长了解决方案:

function doGlob($target, $context) { 
    if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) { 
    foreach ($dirs as $dir) { 
     $result = array_merge($result, doGlob($target, $dir)); 
    } 
    } 
    return $result; 
} 
$files = doGlob('FILE.jpg', 'path_to_images'); 

它将返回给定的$context中任何地方的所有出现的$target文件。

注意:如果context是一个很大的结构,这可能会花费很多时间!

所以,你可能会限制搜索深度,就像这样:

function doGlob($target, $context, $max_depth = -1, $depth = 0) { 
    $result = glob($context . '/' . $target); 
    if ($depth > $max_depth) { 
    return $result; 
    } 
    if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) { 
    foreach ($dirs as $dir) { 
     $result = array_merge($result, doGlob($target, $dir, $max_depth, $depth + 1)); 
    } 
    } 
    return $result; 
} 
$files = doGlob('FILE.jpg', 'path_to_images', <max-depth>); 

在另一方面,如果你打算只检索唯一的文件,你可能会更简单,一旦停止,因为它的发现:

function doGlob($target, $context) { 
    if ($result) { 
    return $result; 
    } 
    if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) { 
    foreach ($dirs as $dir) { 
     $result = array_merge($result, doGlob($target, $dir)); 
    } 
    } 
    return $result; 
} 
$files = doGlob('FILE.jpg', 'path_to_images'); 
+0

它是最好的想法,但如果我不知道它将有多少个子文件夹?它可以是图像/ 2014或图像/ 2014/02或图像/ 2014/02/02等。 –

+0

@MateuszJi所以请看看我的编辑。 – cFreed

0

您可以使用SCANDIR太:

function search($d) 
{ 
    $dir=scandir($d); 
    echo '<ul>'; 
    foreach ($dir as $key => $value) 
    { 
     if($value!='.' && $value!='..') 
     { 
      if(is_dir($d.'/'.$value)) 
      { 
       echo "<li>".$value."</li>"; 
       search($d.'/'.$value); 
      } 

      else 
       echo "<li>".$value."</li>"; 

     } 
    } 

    echo '</ul>'; 
} 

search('images'); 

在这个例子中,I D显示所有文件,但您可以添加一个条件:

function search($d, $search) 
{ 
    $dir=scandir($d); 
    echo '<ul>'; 
    foreach ($dir as $key => $value) 
    { 
     if($value!='.' && $value!='..') 
     { 
      if(is_dir($d.'/'.$value)) 
      { 
       echo "<li>".$value."</li>"; 
       search($d.'/'.$value, $search); 
      } 

      else 
      { 
       echo "<li>".$value."</li>"; 
       if($value==$search) 
        echo "found"; 

      } 

     } 
    } 

    echo '</ul>'; 
} 

search('images', 'your_file');