я использую RecursiveDirectoryIterator
сканировать все файлы и папки в данном корневом каталоге. Это прекрасно работает, но я бы хотел отслеживать все уникальный каталоги в этом списке, так что я не уверен, что RecursiveDirectoryIterator
это путь.
У меня есть структура каталогов
-a
->b
->c
-one
->two
->three
Вот мой код:
<?php
function test($dir){
$in_dir = 'none';
$currdir = 'none';
$thisdir = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($thisdir, RecursiveIteratorIterator::SELF_FIRST);
foreach($files as $object){
//if this is a directory... find out which one it is.
if($object->isDir()){
//figure out if we have changed directories...
$currdir = realpath($object->getPath());
if(strpos($currdir, '.') == false){
$test = strcmp($currdir, $prevdir);
if($test){
echo "current dir changing: ", $currdir, "\n";
$prevdir = $currdir;
}
}
}
}
}
test('fold');
?>
Из этого я получаю следующее:
current dir changing: /Users/<usr>/Desktop/test/fold
current dir changing: /Users/<usr>/Desktop/test/fold/a
current dir changing: /Users/<usr>/Desktop/test/fold/a/b
current dir changing: /Users/<usr>/Desktop/test/fold
current dir changing: /Users/<usr>/Desktop/test/fold/one
current dir changing: /Users/<usr>/Desktop/test/fold/one/two
…Но я хочу только уникальный каталоги.
Возможно, это метод сравнения объектов в цикле, который возвращает дубликаты, поскольку итератор перемещается вверх и вниз по дереву каталогов, когда он анализирует папки.
Следующее сработало для меня. Я также использую array_unique()
Подтвердите отсутствие дубликатов в качестве избыточности.
$dirArray = []; // the array to store dirs
$path = realpath('/some/folder/location');
$objects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::SELF_FIRST
);
// loop through all objects and store names in dirArray[]
foreach($objects as $name => $object){
if ($object->isDir()) {
$dirArray[] = $name;
}
}
// make sure there are no dupes
$result = array_unique($dirArray);
// print array out
print_r($result);
Других решений пока нет …