The RecursiveCallbackFilterIterator class

(PHP 5 >= 5.4.0, PHP 7)

Wstęp

Krótki opis klasy

RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator , RecursiveIterator {
/* Metody */
public __construct ( RecursiveIterator $iterator , string $callback )
public hasChildren ( void ) : bool
/* Metody dziedziczone */
public CallbackFilterIterator::accept ( void ) : bool
}

Przykłady

The callback should accept up to three arguments: the current item, the current key and the iterator, respectively.

Przykład #1 Available callback arguments

<?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
}

?>

Filtering a recursive iterator generally involves two conditions. The first is that, to allow recursion, the callback function should return TRUE if the current iterator item has children. The second is the normal filter condition, such as a file size or extension check as in the example below.

Przykład #2 Recursive callback basic example

<?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;
}

?>

Spis treści

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