Here is a code that may implement similar functionality in PHP 5.2 or 5.3 :
<?php
class RecursiveCallbackFilterIterator extends RecursiveFilterIterator {
public function __construct ( RecursiveIterator $iterator, $callback ) {
$this->callback = $callback;
parent::__construct($iterator);
}
public function accept () {
$callback = $this->callback;
return $callback(parent::current(), parent::key(), parent::getInnerIterator());
}
public function getChildren () {
return new self($this->getInnerIterator()->getChildren(), $this->callback);
}
}
?>
La classe RecursiveCallbackFilterIterator
(PHP 5 >= 5.4.0)
Introduction
Synopsis de la classe
RecursiveCallbackFilterIterator
extends
CallbackFilterIterator
implements
OuterIterator
,
Traversable
,
Iterator
,
RecursiveIterator
{
/* Méthodes */
/* Méthodes héritées */
}Exemples
La fonction de rappel doit accepter jusqu'à 3 arguments : l'élément courant, la clé courante, et l'itérateur courant, respectivement.
Exemple #1 Arguments disponibles pour la fonction de rappel
<?php
/**
* Fonction de rappel pour RecursiveCallbackFilterIterator
*
* @param $current La valeur de l'élément courant
* @param $key La clé de l'élément courant
* @param $iterator Itérateur à filtrer
* @return boolean TRUE pour accepter l'élément courant, FASLE sinon
*/
function my_callback($current, $key, $iterator) {
// Votre filtre ici
}
?>
Le filtrage d'un itérateur récursif implique généralement 2 conditions.
La première est que, pour autoriser la récursion, la fonction
de rappel doit retourner TRUE si l'élément de l'itérateur courant
a un fils. La seconde est une condition de filtrage normale, comme
la vérification de la taille de fichier ou la vérification de l'extension
comme dans l'exemple suivant.
Exemple #2 Exemple simple d'une fonction de rappel récursive
<?php
$dir = new RecursiveDirectoryIterator(__DIR__);
// Filtrage des gros fichiers ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Permet la récursion
if ($iterator->hasChildren()) {
return TRUE;
}
// Vérifie les gros fichiers
if ($current->isFile() && $current->getSize() > 104857600) {
return TRUE;
}
return FALSE;
});
foreach (new RecursiveIteratorIterator($files) as $file) {
echo $file->getPathname() . PHP_EOL;
}
?>
Sommaire
- RecursiveCallbackFilterIterator::__construct — Crée un objet RecursiveCallbackFilterIterator depuis une interface RecursiveIterator
- RecursiveCallbackFilterIterator::getChildren — Retourne l'itérateur fils interne contenu dans un RecursiveCallbackFilterIterator
- RecursiveCallbackFilterIterator::hasChildren — Vérifie si l'élément courant de l'itérateur interne a un fils
a dot belloundja at gmail dot com ¶
4 months ago
Anonymous ¶
1 year ago
Note that the following filters out both files and directories whos names start with the letter "T". The important thing here is that since the function returns false for a directory entry whos name starts with T, the directory is also not traversed recursively.
<?php
$doesntStartWithLetterT = function ($current) {
return $current->getFileName()[0] !== 'T';
};
$rdi = new RecursiveDirectoryIterator(__DIR__);
$files = new RecursiveCallbackFilterIterator($rdi, $doesntStartWithLetterT);
foreach (new RecursiveIteratorIterator($files) as $file) {
echo $file->getPathname() . PHP_EOL;
}
?>
