RecursiveCallbackFilterIterator クラス

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

はじめに

クラス概要

class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator {
/* メソッド */
public __construct(RecursiveIterator $iterator, callable $callback)
public hasChildren(): bool
/* 継承したメソッド */
public FilterIterator::accept(): bool
public FilterIterator::next(): void
public FilterIterator::rewind(): void
public FilterIterator::valid(): bool
public IteratorIterator::next(): void
}

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

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

?>

目次

関連キーワード:  public, veCallbackFilterIterator, クラス, FilterIterator, hasChildren, construct, 条件, 再帰, RecursiveIterator, 内部