A classe RecursiveCallbackFilterIterator

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

Introdução

Resumo da classe

class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator {
/* Métodos */
public function __construct(RecursiveIterator $iterator, callable $callback)
public function hasChildren(): bool
/* Métodos herdados */
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
}

Exemplos

O callback deve aceitar até três argumentos: o item atual, a chave atual e o iterador, respectivamente.

Exemplo #1 Argumentos disponíveis para o callback

<?php

/**
* Callback for RecursiveCallbackFilterIterator
*
* @param $current Valor atual do item
* @param $key Chave atual do item
* @param $iterator Iterador sendo filtrado
* @return boolean TRUE para aceitar o item atual, FALSE caso contrário
*/
function my_callback($current, $key, $iterator) {
// Seu código de filtragem aqui
}

?>

Filtrar um iterador recursivo geralmente envolve duas condições. A primeira é que, para permitir a recursão, a função de retorno de chamada deve retornar true se o item do iterador atual tiver filhos. O segundo é a condição de filtro normal, como um tamanho de arquivo ou extensão verificação como no exemplo abaixo.

Exemplo #2 Exemplo básico de chamada recursiva

<?php

$dir
= new RecursiveDirectoryIterator(__DIR__);

// Filtrar arquivos grandes ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Permitir recursão
if ($iterator->hasChildren()) {
return
TRUE;
}
// Verificar se é um arquivo grande
if ($current->isFile() && $current->getSize() > 104857600) {
return
TRUE;
}
return
FALSE;
});

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

?>

Índice

adicionar nota

Notas de Usuários 2 notes

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