2016-02-26 42 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');