Класс RecursiveCallbackFilterIterator

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

Введение

Обзор классов

RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator , RecursiveIterator {
/* Методы */
public __construct(RecursiveIterator $iterator, string $callback)
public hasChildren(): bool
/* Наследуемые методы */
}

Примеры

Callback-функция может принимать до трёх аргументов: текущий элемент, текущий ключ и итератор, соответственно.

Пример #1 Доступные аргументы callback-функции

<?php

/**
 * Callback-функция для RecursiveCallbackFilterIterator
 *
 * @param $current   Значение текущего элемента
 * @param $key       Ключ текущего элемента
 * @param $iterator  Итератор, который фильтруется
 * @return boolean   TRUE для приёма текущего элемента или FALSE - в ином случае.
 */
function my_callback($current$key$iterator) {
    
// Здесь ваш код фильтрации
}

?>

Фильтрация рекурсивного итератора обычно включает в себя два условия. Первое заключается в том, чтобы разрешить рекурсию. Callback-функция должна возвращать true, если текущий элемент итератора имеет потомков. Второе - это нормальное условие фильтра, например, проверка размера файла или расширения, как в примере ниже.

Пример #2 Простой пример рекурсивного обратного вызова

<?php

$dir 
= new RecursiveDirectoryIterator(__DIR__);

// Фильтр больших файлов ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current$key$iterator) {
    
// Разрешить рекурсию
    
if ($iterator->hasChildren()) {
        return 
TRUE;
    }
    
// Проверка больших файлов
    
if ($current->isFile() && $current->getSize() > 104857600) {
        return 
TRUE;
    }
    return 
FALSE;
});

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

?>

Содержание

add a note add a note

User Contributed Notes 2 notes

up
9
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
-1
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