Как я могу сохранить дерево каталогов в массив на PHP? - PullRequest
1 голос
/ 21 декабря 2010

Я пытаюсь взять каталог со структурой:

top
    folder1
        file1
    folder2
        file1
        file2

И сохраните его в массив, например:

array
(
    'folder1' => array('file1'),
    'folder2' => array('file1', 'file2')
)

Таким образом, я могу легко использовать дерево по всему сайту. Я играл с этим кодом, но он все еще не делает то, что я хочу:

private function get_tree()
{
    $uploads  = __RELPATH__ . DS . 'public' . DS . 'uploads';
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($uploads), RecursiveIteratorIterator::SELF_FIRST);
    $output   = array();

    foreach($iterator as $file)
    {
        $relativePath = str_replace($uploads . DS, '', $file);

        if ($file->isDir())
        {
            if (!in_array($relativePath, $output))
                $output[$relativePath] = array();
        }
    }

    return $output;
}

Ответы [ 2 ]

4 голосов
/ 21 декабря 2010

Я ужасен с рекурсивными функциями. Но мне удалось придумать это ... не уверен, что это то, что вы ищете

function tree($path, $top) {
    $ignore = array('cgi-bin', '.', '..' ); 
    $handle = opendir($path);   

    while( ($file = readdir($handle)) !== false ) {

        if( !in_array( $file, $ignore ) ){              
            if( is_dir("$path/$file") ) {
                $top[$file] = @ tree("$path/$file", $top[$file]);
            } else {
                $top[] = $file;
            }
        }

    }

    closedir( $handle );
    return $top;
}

Предполагается, что ваше дерево каталогов

alt text

выводит

Array
(
    [a] => Array
        (
            [aa] => Array
                (
                    [0] => aa.txt
                )

        )

    [b] => Array
        (
            [0] => bb.txt
        )

    [c] => Array
        (
            [0] => cc.txt
        )

)

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

:)

2 голосов
/ 21 декабря 2010

Похоже, вы не обращались к случаю, когда $relativePath не является каталогом.Вы не описали свой вывод, но я полагаю, что он полностью состоит из пустых массивов без каких-либо желаемых файлов внутри.Это правильно?

Вам нужно обработать конечный случай, когда достигается файл, а не каталог.Сделайте себе удар, я могу попытаться опубликовать для вас позже, если вы все еще боретесь.

Кроме того, я боюсь, что это не будет иметь дело с большими глубинами.Хотя я не уверен, что вам это нужно на основе вашего примера.

- РЕДАКТИРОВАТЬ -

Это не создаст полное дерево, как я объяснил в комментарии ниже, но в зависимости отто, что вы ищете, может быть в порядке.Полное дерево потребует более значительных изменений.Однако то, что я выкладываю ниже, должно как минимум поместить файлы в папки.

private function get_tree()
{
    $uploads  = __RELPATH__ . DS . 'public' . DS . 'uploads';
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($uploads), RecursiveIteratorIterator::SELF_FIRST);
    $output   = array();

    foreach($iterator as $file)
    {
        $relativePath = str_replace($uploads . DS, '', $file);

        if ($file->isDir())
        {
            if (!in_array($relativePath, $output))
            {
                $output[$relativePath] = array();
                $lastDir = $relativePath;
            }
        }
        else 
        {
             $p = path_info($file);
             $d = $p['dirname']; $f = $p['basename'];
             $output[$d][] = basename($f); 
        }
    }

    return $output;
}
...