1<?php 2 3/* 4 * This file is part of the Symfony package. 5 * 6 * (c) Fabien Potencier <fabien@symfony.com> 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace Symfony\Component\Finder\Iterator; 13 14/** 15 * CustomFilterIterator filters files by applying anonymous functions. 16 * 17 * The anonymous function receives a \SplFileInfo and must return false 18 * to remove files. 19 * 20 * @author Fabien Potencier <fabien@symfony.com> 21 * 22 * @extends \FilterIterator<string, \SplFileInfo> 23 */ 24class CustomFilterIterator extends \FilterIterator 25{ 26 private $filters = []; 27 28 /** 29 * @param \Iterator<string, \SplFileInfo> $iterator The Iterator to filter 30 * @param callable[] $filters An array of PHP callbacks 31 * 32 * @throws \InvalidArgumentException 33 */ 34 public function __construct(\Iterator $iterator, array $filters) 35 { 36 foreach ($filters as $filter) { 37 if (!\is_callable($filter)) { 38 throw new \InvalidArgumentException('Invalid PHP callback.'); 39 } 40 } 41 $this->filters = $filters; 42 43 parent::__construct($iterator); 44 } 45 46 /** 47 * Filters the iterator values. 48 * 49 * @return bool 50 */ 51 #[\ReturnTypeWillChange] 52 public function accept() 53 { 54 $fileinfo = $this->current(); 55 56 foreach ($this->filters as $filter) { 57 if (false === $filter($fileinfo)) { 58 return false; 59 } 60 } 61 62 return true; 63 } 64} 65