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);
}
}
?>
La clase RecursiveCallbackFilterIterator
(PHP 5 >= 5.4.0)
Introducción
Sinopsis de la Clase
RecursiveCallbackFilterIterator
extends
CallbackFilterIterator
implements
OuterIterator
,
Traversable
,
Iterator
,
RecursiveIterator
{
/* Métodos */
/* Métodos heredados */
}Ejemplos
La llamada de retorno debe aceptar tres argumentos: El elemento actual, la clave actual y el iterador.
Ejemplo #1 Argumentos de llamada de retorno disponibles
<?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 ser filtrado
* @return boolean TRUE si acepta el elemento actual, de lo contrario FALSE
*/
function my_callback($current, $key, $iterator) {
// Su código de filtrado aquí
}
?>
Filtrar un iterador recursivo generalmente involucra a dos condiciones.
La primera es que, con el fin de permitir la recursividad, la función de
devolución de llamada debe devolver TRUE si el iterador actual tiene hijos.
La segunda es la condición normal de filtro, como el tamaño del archivo 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__);
// Filtra archivos grandes ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Permite recursividad
if ($iterator->hasChildren()) {
return TRUE;
}
// Buscar archivo grande
if ($current->isFile() && $current->getSize() > 104857600) {
return TRUE;
}
return FALSE;
});
foreach (new RecursiveIteratorIterator($files) as $file) {
echo $file->getPathname() . PHP_EOL;
}
?>
Tabla de contenidos
- RecursiveCallbackFilterIterator::__construct — Crear un RecursiveCallbackFilterIterator desde un RecursiveIterator
- RecursiveCallbackFilterIterator::getChildren — D3evuelve los iteradores internos hijos contenidos en un RecursiveCallbackFilterIterator
- RecursiveCallbackFilterIterator::hasChildren — Comprueba si los iteradores internos del elemento actual tiene hijos
a dot belloundja at gmail dot com ¶
5 months ago
Anonymous ¶
1 year 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;
}
?>
