Is there any way to get only images with extensions jpeg
, png
, gif
etc while using
$dir = '/tmp';
$files1 = scandir[$dir];
Madan Sapkota
23.8k11 gold badges112 silver badges115 bronze badges
asked Jul 12, 2010 at 7:19
You can use glob
$images = glob['/tmp/*.{jpeg,gif,png}', GLOB_BRACE];
If you need this to be case-insensitive, you could use a DirectoryIterator
in combination with a RegexIterator
or pass the result of scandir
to array_map
and use a callback that filters any unwanted extensions. Whether you use strpos
, fnmatch
or pathinfo
to get the extension is up
to you.
answered Jul 12, 2010 at 7:20
GordonGordon
307k72 gold badges525 silver badges550 bronze badges
4
The actual question was using scandir and the answers end up in glob. There is a huge difference in both where blob considerably heavy. The same filtering can be done with scandir using the following code:
$images = preg_grep['~\.[jpeg|jpg|png]$~', scandir[$dir_f]];
I hope this would help somebody.
answered Jul 6, 2016 at 13:15
1
Here is a simple way to get only images. Works with PHP >= 5.2 version. The collection of extensions are in lowercase, so making the file extension in loop to lowercase make it case insensitive.
// 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];
I hope this is useful if you want case insensitive and image only extensions.
answered Apr 29, 2015 at 15:39
Madan SapkotaMadan Sapkota
23.8k11 gold badges112 silver badges115 bronze badges
0
I would loop through the files and look at their extensions:
$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;
}
closedir[$dh];
answered Jul 12, 2010 at 7:24
JosiahJosiah
4,6441 gold badge19 silver badges19 bronze badges
You can search the resulting array afterward and discard files not matching your criteria.
scandir
does not have the functionality you seek.
answered Jul 12, 2010 at 7:20
BorealidBorealid
92.3k8 gold badges104 silver badges122 bronze badges
If you would like to scan a directory and return filenames only you can use this:
$fileNames = array_map[
function[$filePath] {
return basename[$filePath];
},
glob['./includes/*.{php}', GLOB_BRACE]
];
scandir[]
will return .
and ..
as well as the files, so the above code is cleaner if you just need filenames or you would like to do other things with the actual filepaths
answered Nov 18, 2017 at 17:17
Aaron OlinAaron Olin
3492 silver badges7 bronze badges
0
I wrote code reusing and putting together parts of the solutions above, in order to make it easier to understand and use: