Parcours non récursif d'un répertoire

/**
* Itérateur de fichiers CSS
*
* @author Stéphane MUNOS
* @version 0.1
* @access public
*
*/
 
class CssFilesIterator extends DirectoryIterator {
 
    public function isCss() {
        if( (!parent::isFile()) ||  (!preg_match('`\.(css)$`i', parent::getFilename())) ) {
            return false;
        }
        return true;
    }
 
 
    public function valid() {
        if (parent::valid()) {
            if (!$this->isCss()) {
                parent::next();
                return $this->valid();
            }
            return true;
        }
        return false;
    }
}

Exemple d'utilisation de la classe :

require_once 'C_cssFilesIterator.php';
$O = new CssFilesIterator('../un_rep/un_rep_avec_des_css/');
while ($O->valid()) {
	echo $O->getFilename().'<br />';
	$O->next();
}

Cet exemple ne renverra que les fichiers ayant pour extension ".css" du répertoire passé en paramètres, les fichiers d'un autre type seront totalement ignorés.
On peut maintenant aller plus loin en implémentant non plus DirectoryIterator mais en utilisant le recursiveDirectoryIterator.

La classe qui suit a été développé dans un but précis, la méthode getCss() renvoie un tableau du type suivant, destiné a remplir une liste de formulaire (select) :

array {
  [menu/ie/style_ie.css] = "/menu/ie/style_ie.css"
  [menu/ie/layout_ie.css] = "/menu/ie/layout_ie.css" 
  [menu/firefox/style_ff.css] = "/menu/firefox/style_ff.css"
  [menu/firefox/layout_ff.css] = "/menu/firefox/layout_ff.css"
  [typo.css] = "/typo.css"
  [plan.css] = "/plan.css"
  [form.css] = "/form.css"
}

Parcours récursif d'un répertoire

/**
* Itérateur récursif de fichiers CSS
*
* @author Stéphane MUNOS
* @version 0.1
* @access public
*
*/
 
class CssFilesIteratorRecursive {
    
    private $iterator = false;
    private $directory = null;
    private $A_return = array();
 
    
    public function __construct($directory) {
        $this->directory = $directory;
        $this->iterator = new recursiveDirectoryIterator($directory);
    }
 
    
    public function getCss($iterator = false) {       
        
        if(!$iterator) {
            $iterator = $this->iterator;
        }
        
        while($iterator->valid()) {
            if($iterator->isDir() AND !$iterator->isDot()) {
                if($iterator->hasChildren()) {
                    $this->A_return = array_merge($this->A_return, $this->getCss($iterator->getChildren()));
                }
            } else {
                if($iterator->isFile()) {
                    $this->A_return[str_replace($this->directory, '',$iterator->getPathName())] = substr(str_replace(substr($this->directory,1,-1), '',$iterator->getPath()),1).'/'.$iterator->getFilename();
                }
            }
            $iterator->next();
        }
       
        return $this->A_return;
    }
    
    
    function valid() {
        if (parent::valid()) {
            if (!$this->isCss()) {
                parent::next();
                return $this->valid();
            }
            return true;
        }
        return false;
    }
}

Exemple d'utilisation :

require_once 'C_cssFilesIteratorRecursive.php';
$O_css = new CssFilesIteratorRecursive('../un_rep_avec_des_sous_rep_css/);	
print_rn($O_css->getCss());
 

Conclusion

Cet exemple est bien sûr perfectible, mais il a l'avantage de pouvoir s'appliquer à n'importe quelle extension de fichiers.
On pourrait même enviseager de passer l'extension du type de fichier désiré en paramètre, afin d'avoir un Iterator beaucoup plus souple.