RecursiveCallbackFilterIterator クラス

はじめに

クラス概要

RecursiveCallbackFilterIterator
extends CallbackFilterIterator
implements RecursiveIterator
/* メソッド */
public RecursiveCallbackFilterIterator::__construct(RecursiveIterator $iterator, callable $callback)
public RecursiveCallbackFilterIterator RecursiveCallbackFilterIterator::getChildren()
public bool RecursiveCallbackFilterIterator::hasChildren()
/* 継承したメソッド */
public bool accept()
public bool FilterIterator::accept()
public mixed FilterIterator::current()
public mixed FilterIterator::key()
public void FilterIterator::next()
public void FilterIterator::rewind()
public bool FilterIterator::valid()
public mixed IteratorIterator::current()
public Iteratornull IteratorIterator::getInnerIterator()
public mixed IteratorIterator::key()
public void IteratorIterator::next()
public void IteratorIterator::rewind()
public bool IteratorIterator::valid()

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

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

?>
目次