繁体   English   中英

如何将目录树保存到PHP中的数组?

[英]How can I save a directory tree to an array in PHP?

我正在尝试采用以下结构的目录:

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;
}

递归函数太可怕了。 但是我设法提出了..不确定是不是你要找的东西

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;
}

假设您的目录树是

替代文字

它输出

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

        )

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

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

)

但是,休息一下,观察每隔300年左右发生的一次日蚀。 当您的孩子,孙子,曾孙子问您“您知道当冬至日蚀发生时您还活着吗?”时,您不想说“不”? 你看见了吗?????”

:)

看来您没有解决$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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM