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);
}
}
?>RecursiveCallbackFilterIterator
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
RecursiveCallbackFilterIterator
Референца за `class.recursivecallbackfilteriterator.php` со подобрена типографија и навигација.
Класата RecursiveCallbackFilterIterator
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Вовед
Синопсис на класата
Примери
Повикот треба да прифаќа до три аргументи: тековната ставка, тековниот клуч и итераторот, соодветно.
Пример #1 Достапни аргументи за повикот
<?php
/**
* Callback for RecursiveCallbackFilterIterator
*
* @param $current Current item's value
* @param $key Current item's key
* @param $iterator Iterator being filtered
* @return boolean TRUE to accept the current item, FALSE otherwise
*/
function my_callback($current, $key, $iterator) {
// Your filtering code here
}
?>
Филтрирањето на рекурзивен итератор генерално вклучува два услови. Првиот е, за да се овозможи рекурзија, функцијата за повикување треба да врати true
дали тековната ставка на итераторот има деца. Вториот е нормалниот услов за филтрирање, како што е проверка на големината на датотеката или наставката како во примерот подолу.
Пример #2 Основен пример за рекурзивен повикател
<?php
$dir = new RecursiveDirectoryIterator(__DIR__);
// Filter large files ( > 100MB)
$files = new RecursiveCallbackFilterIterator($dir, function ($current, $key, $iterator) {
// Allow recursion
if ($iterator->hasChildren()) {
return TRUE;
}
// Check for large file
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 — Проверете дали тековниот елемент на внатрешниот итератор има деца
Белешки од корисници 2 забелешки
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;
}
?>