La clase RecursiveCallbackFilterIterator

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

Introducción

Sinopsis de la Clase

class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator {
/* Métodos */
public function __construct(RecursiveIterator $iterator, callable $callback)
public function hasChildren(): bool
/* Métodos heredados */
public function FilterIterator::accept(): bool
public function FilterIterator::current(): mixed
public function FilterIterator::key(): mixed
public function FilterIterator::next(): void
public function FilterIterator::rewind(): void
public function FilterIterator::valid(): bool
public function IteratorIterator::current(): mixed
public function IteratorIterator::key(): mixed
public function IteratorIterator::next(): void
public function IteratorIterator::rewind(): void
public function IteratorIterator::valid(): bool
}

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