2010-07-12 21 views

回答

73

您可以使用glob

$images = glob('/tmp/*.{jpeg,gif,png}', GLOB_BRACE); 

如果您需要這是不區分大小寫的,你可以結合使用DirectoryIteratorscandir結果的RegexIterator傳遞給array_map並使用一個回調過濾任何不需要的擴展名。無論您使用strpos,fnmatch還是pathinfo來獲得擴展取決於您。

+5

......不再使用'scandir()'。但是否則是正確的。所以不應該是「不,用'glob'」? – Borealid 2010-07-12 07:22:33

+0

@Borealid nitpicker:D – Gordon 2010-07-12 07:24:12

+2

現在讓它不區分大小寫。 > :) – salathe 2010-07-12 08:15:00

5

你可以得到的陣列之後搜索和丟棄的文件不符合您的條件。

scandir沒有您尋求的功能。

12

我會遍歷文件,看看他們的擴展:

$dir = '/tmp'; 
$dh = opendir($dir); 
while (false !== ($fileName = readdir($dh))) { 
    $ext = substr($fileName, strrpos($fileName, '.') + 1); 
    if(in_array($ext, array("jpg","jpeg","png","gif"))) 
     $files1[] = $fileName; 
} 
10

這裏有一個簡單的方法來獲得唯一的圖像。適用於PHP> = 5.2版本。擴展的集合是小寫的,因此將循環中的文件擴展名設置爲小寫使其不區分大小寫。

// image extensions 
$extensions = array('jpg', 'jpeg', 'png', 'gif', 'bmp'); 

// init result 
$result = array(); 

// directory to scan 
$directory = new DirectoryIterator('/dir/to/scan/'); 

// iterate 
foreach ($directory as $fileinfo) { 
    // must be a file 
    if ($fileinfo->isFile()) { 
     // file extension 
     $extension = strtolower(pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION)); 
     // check if extension match 
     if (in_array($extension, $extensions)) { 
      // add to result 
      $result[] = $fileinfo->getFilename(); 
     } 
    } 
} 
// print result 
print_r($result); 

我希望這是有用的,如果你想不區分大小寫和圖像只有擴展名。

+0

完美的作品! – 2016-03-04 23:15:55

16

實際的問題是使用scandir並且答案以glob結尾。兩者在相當重的地方存在巨大差異。使用下面的代碼可以使用scandir完成相同的過濾:

$images = preg_grep('~\.(jpeg|jpg|png)$~', scandir($dir_f)); 

我希望這可以幫助某人。

1

如果你想掃描目錄,返回文件名,只有你可以使用這個:

$fileNames = array_map(
    function($filePath) { 
     return basename($filePath); 
    }, 
    glob('./includes/*.{php}', GLOB_BRACE) 
); 

scandir()將返回...以及文件,因此上面的代碼是清潔的,如果你只需要或者你想用實際的文件路徑做其他的事情

+0

謝謝。 – 2018-01-24 08:15:58