2015-12-31 2 views
4

:: РЕШЕНИЕ ::RegexIterator фильтр изображения, игнорировать определенный каталог

используя @RomanPerekhrest ответ с небольшими изменениями, у меня есть то, что мне нужно. Это добавляет несколько каталогов для поиска рекурсивно, а также для фильтрации определенных папок (в моем случае: «_thumbs»). Окончательный код ниже:

$dir1 = new RecursiveDirectoryIterator("./folder01"); 
$dir2 = new RecursiveDirectoryIterator("./folder02"); 
$dir3 = new RecursiveDirectoryIterator("./folder03"); 
$iterators = new AppendIterator(); 

$filter = function ($file, $key, $iterator) { 
    if ($iterator->hasChildren() && $file->getFilename() != "_thumbs") { 
     return true; 
    } 
return $file->isFile(); 
}; 

$iterators->append(new RecursiveIteratorIterator($dir1)); 
$iterators->append($dir2); 
$iterators->append(new RecursiveIteratorIterator(new RecursiveCallbackFilterIterator($dir3, $filter))); 

$rgIt = new RegexIterator($iterators, "/^.+\.jpg$/i"); 
$files = iterator_to_array($rgIt); 

:: Оригинальный вопрос ::

У меня трудное время, выясняя RegexIterator. Я пытаюсь отфильтровать каталог, который находится внутри родительского каталога, который был проверен RecursiveIteratorIterator. В моем коде ниже $ dir3 имеет несколько каталогов, следовательно, RecursiveIteratorIterator, однако он также имеет каталог «_thumbs», который я не хочу обрабатывать. В настоящее время RegexIterator фильтрует и сохраняет изображения .jpg, но я также хотел бы убить все, что было схвачено из каталога «_thumbs».

$dir1 = new RecursiveDirectoryIterator("./folder01"); 
$dir2 = new RecursiveDirectoryIterator("./folder02"); 
$dir3 = new RecursiveDirectoryIterator("./folder03"); // <<< this dir has a _thumbs directory that I don't want to process 
$iterators = new AppendIterator(); 

$iterators->append(new RecursiveIteratorIterator($dir1)); 
$iterators->append($dir2); 
$iterators->append(new RecursiveIteratorIterator($dir3)); 

$rgIt = new RegexIterator($iterators, "/^.+\.jpg$/i"); //<<< this filters and keeps .jpg images. I don't fully understand the syntax though 
$files = iterator_to_array($rgIt); 


usort($files, function($a, $b){ 
    if(filectime($a) == filectime($b)){ 
     return 0; 
    } 
    return filectime($a) > filectime($b) ? -1 : 1; 
}); 

$files = array_slice($files, 0 , 18); 

:: EDIT01 ::

Вот еще один тест, который я попробовал, но и не получить в любом месте с ним. Пробовал использовать RecursiveFilterIterator, но я сомневаюсь, что правильно его использую. Ошибка, которую я получаю, говорит «Argument 1 passed to RecursiveFilterIterator::__construct() must implement interface RecursiveIterator, instance of AppendIterator given».

$dir1 = new RecursiveDirectoryIterator("./folder01"); 
$dir2 = new RecursiveDirectoryIterator("./folder02"); 
$dir3 = new RecursiveDirectoryIterator("./folder03"); 
$iterators = new AppendIterator(); 

$iterators->append(new RecursiveIteratorIterator($dir1)); 
$iterators->append($dir2); 
$iterators->append(new RecursiveIteratorIterator($dir3)); 

class DirFilter extends RecursiveFilterIterator{ 
    public function accept(){ 
     $excludes = "/_thumbs"; 
     return !(in_array($this->getFilename(), $excludes)); 
    } 
} 

$filterItr = new DirFilter($iterators); 

$rgIt = new RegexIterator($filterItr, "/^.+\.jpg$/i"); 
$files = iterator_to_array($rgIt); 

ответ

1

Используйте отрицательное утверждение в шаблоне регулярного выражения:

... 
$rgIt = new RegexIterator($iterators, "/(?!\/_thumbs\/)^.+\.jpg$/i"); 
$files = iterator_to_array($rgIt); 
... 

Если выше не работает, попробуйте использовать RecursiveCallbackFilterIterator отфильтровать "накатанной" изображения:

$filter = function ($file, $key, $iterator) { 
    if ($iterator->hasChildren() && $file->getFilename() == "_thumbs") { 
     return true; 
    } 
    return $file->isFile(); 
}; 
... 
$iterators->append($dir2); 
$iterators->append(new RecursiveIteratorIterator(new RecursiveCallbackFilterIterator($dir3, $filter))); 
... 
+0

Спасибо для ответа. Это все равно обрабатывает каталог «_thumbs» внутри $ dir3. Может быть, путь должен быть более конкретным? Может быть: '' /(?!\/./ parentfolder/_thumbs \ /) ^. + \. Jpg $/i "'? – dotcommer

+0

@dotcommer, я обновил свой пост. Попробуйте другой подход – RomanPerekhrest

+0

Получил! Я просто изменил '==" _thumbs ")' to '! =" _thumbs ")', чтобы отфильтровать каталог больших пальцев. Большое спасибо за вашу помощь @RomanPerekhrest! – dotcommer

Смежные вопросы