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
/* 継承したメソッド */
}

コールバックは、三つの引数を受け付けなければなりません。 それぞれ、現在のアイテム、現在のキー、そしてイテレータを表します。

例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
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