ScotlandPHP

Класс RecursiveCallbackFilterIterator

(PHP 5 >= 5.4.0, PHP 7)

Введение

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

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

Примеры

Обратный вызов может принимать до трех аргументов: текущий элемент, текущий ключ и итератор соответственно.

Пример #1 Доступные аргументы обратного вызова

<?php

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

?>

Фильтрация рекурсивного итератора обычно включает в себя два условия. Первое заключается в том, чтобы разрешить рекурсию. Функция обратного вызова должна возвращать 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
8
a dot belloundja at gmail dot com
4 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
5 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