вернуть все уникальные каталоги в иерархии

0

Я использую 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

... Но мне нужны только уникальные каталоги.

Теги:
directory
iterator
recursion

1 ответ

1
Лучший ответ

Возможно, это метод сравнения объектов в цикле, который возвращает дубликаты, так как итератор перемещается вверх и вниз по дереву каталогов, когда он анализирует папки.

Следующие работали для меня. Я также использую 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню