ConFoo: Call for paper is now Open

La classe RecursiveCallbackFilterIterator

(PHP 5 >= 5.4.0)

Introduction

Synopsis de la classe

RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator , RecursiveIterator {
/* Méthodes */
public __construct ( RecursiveIterator $iterator , string $callback )
public RecursiveCallbackFilterIterator getChildren ( void )
public void hasChildren ( void )
/* Méthodes héritées */
public string CallbackFilterIterator::accept ( void )
}

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

add a note add a note

User Contributed Notes 2 notes

up
1
a dot belloundja at gmail dot com
1 year ago
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);
       
    }
   
}

?>
up
0
Anonymous
2 years 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;
}
?>
To Top