Класс RecursiveCallbackFilterIterator
(PHP 5 >= 5.4.0)
Введение
Обзор классов
RecursiveCallbackFilterIterator
extends
CallbackFilterIterator
implements
OuterIterator
,
Traversable
,
Iterator
,
RecursiveIterator
{
/* Методы */
/* Наследуемые методы */
}Примеры
Обратный вызов может принимать до трех аргументов: текущий элемент, текущий ключ и итератор соответсвенно.
Пример #1 Доступные аргументы обратного вызова
<?php
/**
* Обратный вызов для RecursiveCallbackFilterIterator
*
* @param $current Значение текущего элемента
* @param $key Ключ текущего элемента
* @param $iterator Итератор, который фильтруется
* @return boolean TRUE для приема текущего элемента или FALSE - в ином случае.
*/
function my_callback($current, $key, $iterator) {
// Здесь ваш код фильтрации
}
?>
Фильтрация рекурсивного итератора обычно включает в себя два условия.
Первое заключается в том, чтобы разрешить рекурсию. Функция обратного вызова должна возвращать TRUE
,
если текущий элемент итератора имеет потомков.
Второе - это нормальное условие фильтра, например, проверка размера файла или расширения,
как в примере ниже.
Пример #2 Простой пример рекурсивного обратного вызова
<?php
$dir = new FilesystemIterator(__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;
}
?>
Содержание
- RecursiveCallbackFilterIterator::__construct — Создает объект класса RecursiveCallbackFilterIterator на основе объекта RecursiveIterator
- RecursiveCallbackFilterIterator::getChildren — Возвращает дочерние элементы итератора, хранящегося внутри RecursiveCallbackFilterIterator
- RecursiveCallbackFilterIterator::hasChildren — Проверяет, содержит ли текущий элемент внутреннего итератора дочерние элементы
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Класс AppendIterator
- Класс ArrayIterator
- Класс CachingIterator
- Класс CallbackFilterIterator
- Класс DirectoryIterator
- Класс EmptyIterator
- Класс FilesystemIterator
- Класс FilterIterator
- Класс GlobIterator
- Класс InfiniteIterator
- Класс IteratorIterator
- Класс LimitIterator
- Класс MultipleIterator
- Класс NoRewindIterator
- Класс ParentIterator
- Класс RecursiveArrayIterator
- Класс RecursiveCachingIterator
- Класс RecursiveCallbackFilterIterator
- Класс RecursiveDirectoryIterator
- Класс RecursiveFilterIterator
- Класс RecursiveIteratorIterator
- Класс RecursiveRegexIterator
- Класс RecursiveTreeIterator
- Класс RegexIterator
Коментарии
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;
}
?>
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);
}
}
?>