RecursiveCallbackFilterIterator クラス
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
はじめに
クラス概要
/* メソッド */
/* 継承したメソッド */
}例
コールバックは、三つの引数を受け付けなければなりません。 それぞれ、現在のアイテム、現在のキー、そしてイテレータを表します。
例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;
}
?>
目次
- RecursiveCallbackFilterIterator::__construct — RecursiveIterator から RecursiveCallbackFilterIterator を作成する
- RecursiveCallbackFilterIterator::getChildren — RecursiveCallbackFilterIterator に含まれる内部イテレータの子を返す
- RecursiveCallbackFilterIterator::hasChildren — 内部イテレータの現在の要素が子を持つかどうかを調べる
+add a note
User Contributed Notes 2 notes
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);
}
}
?>
Anonymous ¶
13 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;
}
?>
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google