PHP Conference Nagoya 2025

A classe RecursiveCallbackFilterIterator

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

Introdução

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

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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