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