PHP script to parse directory, list all images and add class="last" to the last image in the directory

10,469

Solution 1

If you don't echo or concatenate the <img> and add the filename to an array you can easily generate the markup you want.

<?php
    $dir = 'wp-content/uploads/';
    $imgs = array();

    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            if (!is_dir($file) && preg_match("/\.(bmp|jpe?g|gif|png)$/", $file)) {
                array_push($imgs, $file);
            }
        }

        closedir($dh);
    } else {
        die('cannot open ' . $dir);
    }

    foreach ($imgs as $idx=>$img) {
        $class = ($idx == count($imgs) - 1 ? ' class="last"' : '');
        echo '<img src="' . $dir . $img . '" alt="' . 
             $img . '"' . $class . ' />' . "\n";
    }
?>

Solution 2

I would use DirectoryIterator to get all files, the filter this using a custom FilterIterator and then a CachingIterator to check for the last element:

class ExtensionFilter extends FilterIterator {
    public function accept() {
        return $this->current()->isFile() && preg_match("/\.(bmp|jpe?g|gif|png)$/", $this->current()->getBasename());
    }
}

$it = new CachingIterator(new ExtensionFilter(new DirectoryIterator($dir)));
foreach ($it as $dir) {
    $filename = $dir->getFilename();
    echo '<img src="'.$filename.'" '.($it->hasMore() ? '' : ' class="last"').'>';
}
Share:
10,469
Scott B
Author by

Scott B

Updated on June 04, 2022

Comments

  • Scott B
    Scott B almost 2 years

    I'm able to parse through the directory and list all images with any of the functions below. I just need to insert a class="last" attribute into the img tag of the last element in the loop.

    Also, which of these functions works best for what I'm trying to do?

    Any help much appreciated!

    function get_images1() {
    
    $exts = 'jpg jpeg png gif';
    
    $str = ''; $i = -1; // Initialize some variables
    $folder = './wp-content/uploads';
    
    $handle = opendir($folder);
    $exts = explode(' ', $exts);
    while (false !== ($file = readdir($handle))) {
        foreach($exts as $ext) { // for each extension check the extension
            if (preg_match('/\.'.$ext.'$/i', $file, $test)) { // faster than ereg, case insensitive
                //$str .= $file;
                $str .="<img src='wp-content/uploads/". $file ."' alt='" . $file . "' />";
                //if ($str) $str .= '|';
                ++$i;
            }
        }
    }
    echo $str;
    closedir($handle); // Were not using it anymore
    return $str;
    

    }

    function get_images2() {
    
    //Open images directory
    $dir = @ opendir("wp-content/uploads/");
    
    //List files in uploads directory
    while (($file = readdir($dir)) !== false)
    {
    if(ereg("(.*)\.(jpg|bmp|jpeg|png|gif)", $file))
        {
        echo '<img src="wp-content/uploads/'. $file .'" alt="" />';
        }
    }
    closedir($dir);
    }
    
    function get_images3() {
    
    $dir = 'wp-content/uploads/';
    $files = scandir($dir);
    //print_r($files);
    $num = count($files);
    for($n=0; $n<$num; $n++) 
    {
    if(ereg("(.*)\.(jpg|bmp|jpeg|png|gif)", $files[$n]))
        {
        echo '<img src="wp-content/uploads/'. $files[$n] .'" alt="" />';
        }
    }
    }
    
    function get_images()
    {
    $directory = 'wp-content/uploads/';
    $directory_stream = @ opendir($directory);
    // Display information about the directory stream
    //  print_r ($directory_stream);
    while ($entry = readdir ($directory_stream)) 
        {
        if (! is_file ("$directory/$entry"))
        continue;
        echo '<img src="wp-content/uploads/'. $entry .'" alt="" />';
        }
    }
    
  • Scott B
    Scott B over 14 years
    This works perfectly, with one exception. The file extensions must be in lowercase. How can I tweak this to account for the user who uses JPEG, Jpeg, JpeG, etc?
  • Scott B
    Scott B over 14 years
    i was able to add $/i to allow case insensitive on the match. This is perfect stackoverflow rocks... RC rocks too!