<?php 
/* 
 * This file is part of the File_Iterator package. 
 * 
 * (c) Sebastian Bergmann <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
/** 
 * Factory Method implementation that creates a File_Iterator that operates on 
 * an AppendIterator that contains an RecursiveDirectoryIterator for each given 
 * path. 
 * 
 * @since     Class available since Release 1.1.0 
 */ 
class File_Iterator_Factory 
{ 
    /** 
     * @param  array|string   $paths 
     * @param  array|string   $suffixes 
     * @param  array|string   $prefixes 
     * @param  array          $exclude 
     * @return AppendIterator 
     */ 
    public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = array()) 
    { 
        if (is_string($paths)) { 
            $paths = array($paths); 
        } 
 
        $paths   = $this->getPathsAfterResolvingWildcards($paths); 
        $exclude = $this->getPathsAfterResolvingWildcards($exclude); 
 
        if (is_string($prefixes)) { 
            if ($prefixes != '') { 
                $prefixes = array($prefixes); 
            } else { 
                $prefixes = array(); 
            } 
        } 
 
        if (is_string($suffixes)) { 
            if ($suffixes != '') { 
                $suffixes = array($suffixes); 
            } else { 
                $suffixes = array(); 
            } 
        } 
 
        $iterator = new AppendIterator; 
 
        foreach ($paths as $path) { 
            if (is_dir($path)) { 
                $iterator->append( 
                  new File_Iterator( 
                    new RecursiveIteratorIterator( 
                      new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS) 
                    ), 
                    $suffixes, 
                    $prefixes, 
                    $exclude, 
                    $path 
                  ) 
                ); 
            } 
        } 
 
        return $iterator; 
    } 
 
    /** 
     * @param  array $paths 
     * @return array 
     */ 
    protected function getPathsAfterResolvingWildcards(array $paths) 
    { 
        $_paths = array(); 
 
        foreach ($paths as $path) { 
            if ($locals = glob($path, GLOB_ONLYDIR)) { 
                $_paths = array_merge($_paths, $locals); 
            } else { 
                $_paths[] = $path; 
            } 
        } 
 
        return $_paths; 
    } 
} 
 
 |