Вы можете расширить класс RecursiveFilterIterator следующим образом:
class ExtensionFilter extends RecursiveFilterIterator
{
/**
* Hold the extensions pass to the class constructor
*/
protected $extensions;
/**
* ExtensionFilter constructor.
*
* @param RecursiveIterator $iterator
* @param string|array $extensions Extension to filter as an array ['php'] or
* as string with commas in between 'php, exe, ini'
*/
public function __construct(RecursiveIterator $iterator, $extensions)
{
parent::__construct($iterator);
$this->extensions = is_array($extensions) ? $extensions : array_map('trim', explode(',', $extensions));
}
public function accept()
{
if ($this->hasChildren()) {
return true;
}
return $this->current()->isFile() &&
in_array(strtolower($this->current()->getExtension()), $this->extensions);
}
public function getChildren()
{
return new self($this->getInnerIterator()->getChildren(), $this->extensions);
}
Теперь вы можете создать экземпляр RecursiveDirectoryIterator с путем в качестве аргумента следующим образом:
$iterator = new RecursiveDirectoryIterator('\path\to\dir');
$iterator = new ExtensionFilter($iterator, 'xml, php, ini');
foreach($iterator as $file)
{
echo $file . '<br />';
}
Это будет список файловтолько в текущей папке. Чтобы также получить файлы в подкаталогах, передайте $ iterator (ExtensionFIlter Iterator) в RecursiveIteratorIterator в качестве аргумента:
$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
Теперь запустите цикл foreach на этом итераторе.Вы получите файлы с указанным расширением
Примечание: - Также обязательно запустите ExtensionFilter перед RecursiveIteratorIterator, в противном случае вы получите все файлы