PHP 8.4.1 Released!

La clase RecursiveCallbackFilterIterator

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

Introducción

Sinopsis de la Clase

class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator, RecursiveIterator {
/* Métodos */
public __construct(RecursiveIterator $iterator, string $callback)
public hasChildren(): bool
/* Métodos heredados */
}

Ejemplos

La llamada de retorno debería aceptar hasta tres argumentos: el elemento actual, la clave actual y el iterador, respectivamente.

Ejemplo #1 Argumentos disponibles de la llamada de retorno

<?php

/**
* Llamada de retorno para RecursiveCallbackFilterIterator
*
* @param $current El valor del elemento actual
* @param $key La clave del elemento actual
* @param $iterator El iterador a filtrar
* @return boolean TRUE si acepta el elemento actual, de lo contrario FALSE
*/
function my_callback($current, $key, $iterator) {
// Aquí, el código de filtrado
}

?>

Filtrar un iterador recursivo generalmente conlleva dos condiciones. La primera es que, con el fin de permitir la recursividad, la función de llamada de retorno debería devolver true si el iterador actual tiene hijos. La segunda es la condición normal de filtro, como el tamaño de fichero o la comprobación de la extensión como en el ejemplo de abajo.

Ejemplo #2 Ejemplo básico de llamada de retorno recursiva

<?php

$dir
= new FilesystemIterator(__DIR__);

// Filtrar ficheros de gran tamaño ( > 100MB)
$ficheros = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Permitir recursividad
if ($iterator->hasChildren()) {
return
TRUE;
}
// Buscar ficheros de gran tamaño
if ($current->isFile() && $current->getSize() > 104857600) {
return
TRUE;
}
return
FALSE;
});

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

?>

Tabla de contenidos

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