PHP Conference Japan 2024

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 条注释

8
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);

}

}

?>
-2
匿名用户
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