web-dev-qa-db-ja.com

PHPでscandirを使用して画像のみを取得する方法は?

使用中に拡張子がjpegpnggifなどの画像のみを取得する方法はありますか

$dir    = '/tmp';
$files1 = scandir($dir);
39
esafwan

glob を使用できます

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

大文字と小文字を区別しない場合は、DirectoryIteratorRegexIteratorまたはパスと組み合わせて使用​​できます。 scandirarray_mapに変換し、不要な拡張子をフィルタリングするコールバックを使用します。 strposfnmatch、またはpathinfoのいずれを使用して拡張機能を取得するかはユーザー次第です。

86
Gordon

実際の質問はscandirを使用しており、回答は最終的にglobになります。ブロブがかなり重い場合は両方に大きな違いがあります。次のコードを使用して、scandirで同じフィルタリングを実行できます。

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

これが誰かの助けになることを願っています。

33
Rajesh Kumar R

私はファイルをループして、それらの拡張子を見ます:

$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;
}
14
Josiah

以下は、画像のみを取得する簡単な方法です。 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);

大文字と小文字を区別せず、画像のみの拡張機能が必要な場合に便利です。

10
Madan Sapkota

結果の配列を後で検索し、条件に一致しないファイルを破棄できます。

scandirには、求める機能がありません。

6
Borealid

ディレクトリをスキャンしてファイル名のみを返したい場合は、これを使用できます:

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

scandir()は、ファイルだけでなく_._および_.._を返すので、ファイル名だけが必要な場合や、実際のファイルパスで他のことをしたい場合は、上記のコードはきれいです

2
Aaron Olin