PHP Conference Nagoya 2025

La classe RecursiveCallbackFilterIterator

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Introduction

Synopsis de la classe

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

User Contributed Notes 2 notes

up
8
a dot belloundja at gmail dot com
11 years 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
-2
Anonymous
12 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