La clase RecursiveCallbackFilterIterator

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

Introducción

Sinopsis de la Clase

Ejemplos

La función de devolución de llamada debe aceptar hasta 3 argumentos: el elemento actual, la clave actual, y el iterador actual, respectivamente.

Ejemplo #1 Argumentos disponibles para la función de devolución de llamada

<?php

/**
* Función de devolución de llamada para RecursiveCallbackFilterIterator
*
* @param $current El valor del elemento actual
* @param $key La clave del elemento actual
* @param $iterator Iterador a filtrar
* @return boolean TRUE para aceptar el elemento actual, FALSE en caso contrario
*/
function my_callback($current, $key, $iterator) {
// Su filtro aquí
}

?>

El filtrado de un iterador recursivo implica generalmente 2 condiciones. La primera es que, para permitir la recursión, la función de devolución de llamada debe devolver true si el elemento del iterador actual tiene un hijo. La segunda es una condición de filtrado normal, como la verificación del tamaño de fichero o la verificación de la extensión como en el ejemplo siguiente.

Ejemplo #2 Ejemplo simple de una función de devolución de llamada recursiva

<?php

$dir
= new RecursiveDirectoryIterator(__DIR__);

// Filtro de ficheros grandes ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Permite la recursión
if ($iterator->hasChildren()) {
return
TRUE;
}
// Verifica ficheros grandes
if ($current->isFile() && $current->getSize() > 104857600) {
return
TRUE;
}
return
FALSE;
});

foreach (new
RecursiveIteratorIterator($files) as $file) {
echo
$file->getPathname() . PHP_EOL;
}

?>

Tabla de contenidos

add a note

User Contributed Notes 2 notes

up
8
a dot belloundja at gmail dot com
12 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
-1
Anonymous
13 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