Исключить папки из рекурсии в рекурсивном каталоге iterator php

Мне нужно исключить все файлы и папки из определенных каталогов при выполнении рекурсии. У меня есть этот код:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($websiteRoot.$file["filepathfromroot"])); foreach ($it as $currentfile) { if (!$it->isDot()&&$it->isFile()&&!in_array($it->getSubPath(), $file["exclude-directories"])) { //do something } } 

Однако этот подпункт будет соответствовать только детям, а не файлам и подкаталогам от детей. т.е. для структуры каталогов Foo / bar / hello.php. Если вы добавите Foo в список исключений, hello.php все равно попадет в результат.

У кого-нибудь есть решение для этого?

Related of "Исключить папки из рекурсии в рекурсивном каталоге iterator php"

Заменить:

 in_array($it->getSubPath(), $file["exclude-directories"]) 

Что-то вроде:

 !in_array_beginning_with($it->getSubPath(), $file["exclude-directories"]) 

И вы реализуете функцию:

 function in_array_beginning_with($path, $array) { foreach ($array as $begin) { if (strncmp($path, $begin, strlen($begin)) == 0) { return true; } } return false; } 

Но это не очень хороший способ, потому что вы будете рекурсивно попадать в бесполезные каталоги, даже если они очень большие и глубокие. В вашем случае я предлагаю вам выполнить рекурсивную функцию старой школы, чтобы прочитать ваш каталог:

 <?php function directory_reader($dir, array $ignore = array (), array $deeps = array ()) { array_push($deeps, $dir); $fulldir = implode("/", $deeps) . "/"; if (is_dir($fulldir)) { if (($dh = opendir($fulldir)) !== false) { while (($file = readdir($dh)) !== false) { $fullpath = $fulldir . $file; if (in_array($fullpath, $ignore)) { continue ; } // do something with fullpath echo $fullpath . "<br/>"; if (is_dir($fullpath) && (strcmp($file, '.') != 0) && (strcmp($file, '..') != 0)) { directory_reader($file, $ignore, $deeps); } } closedir($dh); } } array_pop($deeps); } 

Если вы попробуете directory_reader(".", array("aDirectoryToIngore")) , он вообще не будет читаться.