<?PHP
  
// Original PHP code by Chirp Internet: www.chirp.com.au
  // Please acknowledge use of this code by including this header.

  
class FileExtFilter extends FilterIterator
  
{
    private 
$fileext;

    public function 
__construct(Iterator $iterator$fileext)
    {
      
parent::__construct($iterator);
      
$this->fileext $fileext;
    }

    public function 
accept()
    {
      
$file $this->getInnerIterator()->current();
      return 
preg_match("/\.({$this->fileext})$/"$file);
    }
  }

  function 
getFilteredFileList($dir$ext)
  {
    
$retval = array();

    
// add trailing slash if missing
    
if(substr($dir, -1) != "/"$dir .= "/";

    
// open directory for reading
    
$d = new DirectoryIterator($dir) or die("getFilteredFileList: Failed opening directory $dir for reading");
    
$iterator = new FileExtFilter($d$ext);
    foreach(
$iterator as $fileinfo) {
      
// skip hidden files
      
if($fileinfo->isDot()) continue;
      
$retval[] = array(
        
'name' => "{$dir}{$fileinfo}",
        
'type' => ($fileinfo->getType() == "dir") ? "dir" mime_content_type($fileinfo->getRealPath()),
        
'size' => $fileinfo->getSize(),
        
'lastmod' => $fileinfo->getMTime()
      );
    }

    return 
$retval;
  }
?>

<h1>Applying a FilterIterator</h1>

<table class="collapse" border="1">
<thead>
<tr><th>Name</th><th>Type</th><th>Size</th><th>Last Modified</th></tr>
</thead>
<tbody>
<?PHP
  $dirlist 
getFilteredFileList("images/""jpe?g"); // jpg, jpeg
  // output file list as table rows
  
foreach($dirlist as $file) {
    echo 
"<tr>\n";
    echo 
"<td><a href=\"{$file['name']}\">",basename($file['name']),"</a></td>\n";
    echo 
"<td>{$file['type']}</td>\n";
    echo 
"<td>{$file['size']}</td>\n";
    echo 
"<td>",date('r'$file['lastmod']),"</td>\n";
    echo 
"</tr>\n";
  }
?>
</tbody>
</table>