Как получить только изображения с помощью scandir в PHP?
есть ли способ получить только образы с расширениями jpeg, png, gif etc при использовании
$dir    = '/tmp';
$files1 = scandir($dir);
6 ответов
можно использовать glob
$images = glob('/tmp/*.{jpeg,gif,png}', GLOB_BRACE);
Если вам нужно, чтобы это было без учета регистра, вы можете использовать DirectoryIterator в сочетании с RegexIterator или сдать результат scandir до array_map и используйте обратный вызов, который фильтрует любые нежелательные расширения. Используете ли вы strpos, fnmatch или pathinfo чтобы получить расширение до вас.
фактический вопрос использовал scandir, и ответы заканчиваются в glob. Существует огромная разница в обоих, где blob значительно тяжелый. Такую же фильтрацию можно выполнить со scandir, используя следующий код:
$images = preg_grep('~\.(jpeg|jpg|png)$~', scandir($dir_f));
Я надеюсь, что это поможет кому-то.
Я бы прошелся по файлам и посмотрел на их расширения:
$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;
}
вот простой способ получить только изображения. Работает с 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);
Я надеюсь, что это полезно, если вы хотите без учета регистра и только расширения изображения.
вы можете искать результирующий массив после этого и отбрасывать файлы, не соответствующие вашим критериям.
scandir не имеет функциональности, которую вы ищете.
если вы хотите сканировать каталог и возвращать только имена файлов, вы можете использовать это:
$fileNames = array_map(
    function($filePath) {
        return basename($filePath);
    },
    glob('./includes/*.{php}', GLOB_BRACE)
);
scandir() вернутся . и .. а также файлы, поэтому приведенный выше код чище, если вам просто нужны имена файлов или вы хотели бы сделать другие вещи с фактическими filepaths
