Мне нужно исключить все файлы и папки из определенных каталогов при выполнении рекурсии. У меня есть этот код:
$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 все равно попадет в результат.
У кого-нибудь есть решение для этого?
Заменить:
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"))
, он вообще не будет читаться.