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

?>

目录

添加注释

用户贡献的注释 2 个注释

a dot belloundja at gmail dot com
11 年前
以下代码可能在 PHP 5.2 或 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);

}

}

?>
匿名
12 年前
请注意,以下代码会过滤掉名称以字母“T”开头的文件和目录。重要的是,由于该函数对于名称以“T”开头的目录条目返回 false,因此不会递归遍历该目录。

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