downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

RecursiveCallbackFilterIterator::__construct> <RecursiveCachingIterator::hasChildren
[edit] Last updated: Fri, 24 May 2013

view this page in

La clase RecursiveCallbackFilterIterator

(PHP 5 >= 5.4.0)

Introducción

Sinopsis de la Clase

RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator , Traversable , Iterator , RecursiveIterator {
/* Métodos */
public __construct ( RecursiveIterator $iterator , string $callback )
public RecursiveCallbackFilterIterator getChildren ( void )
public void hasChildren ( void )
/* Métodos heredados */
public string CallbackFilterIterator::accept ( void )
}

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



add a note add a note User Contributed Notes RecursiveCallbackFilterIterator - [2 notes]
up
0
a dot belloundja at gmail dot com
4 months 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
0
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;
}
?>

 
show source | credits | sitemap | contact | advertising | mirror sites