How to get only images using scandir in PHP?

后端 未结 6 1301
逝去的感伤
逝去的感伤 2020-11-27 15:52

Is there any way to get only images with extensions jpeg, png, gif etc while using

$dir    = \'/tmp\';
$files1 = scand         


        
相关标签:
6条回答
  • 2020-11-27 16:05

    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.

    0 讨论(0)
  • 2020-11-27 16:07

    You can search the resulting array afterward and discard files not matching your criteria.

    scandir does not have the functionality you seek.

    0 讨论(0)
  • 2020-11-27 16:08

    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.

    0 讨论(0)
  • 2020-11-27 16:16

    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);
    
    0 讨论(0)
  • 2020-11-27 16:20

    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

    0 讨论(0)
  • 2020-11-27 16:31

    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.

    0 讨论(0)
提交回复
热议问题