扁平化PHP中mysql数据库的递归文件夹结构


Flatten recursive folder structure in PHP for mysql dbase

也许有比PHP更好的方法,我愿意听取意见。

问题:我对每个用户都有一个文件夹结构。此文件夹可能包含文件或子文件夹。我只关心有文件的文件夹。我能够运行查询并获得多维数组上的递归列表(来自web上发布的PHP代码)。问题是,我得到一个多维数组,当它被平摊时,只列出最内部的文件名,并且我需要在sql数据库中存储路径和文件-或者-路径+文件。其理念是允许用户通过网络界面查看和删除文件。

下面是PHP递归函数的一个示例结果。在名为"Jimmy"的文件夹中,您发现:
Array
(
[0] => info.txt
[1] => log.tmp
[2] => README.md
[css] => Array
    (
        [0] => style.css
    )
[images] => Array
    (
        [0] => flower.gif
    )
[3] => index.php
[testDir] => Array
    (
        [anotherTestDir] => Array
            (
                [0] => test2.php
            )
    )
[5] => listing.txt
[temp] => Array
    (
    )
)

我希望看到的是:

/jimmy/info.txt
/jimmy/log.tmp
/jimmy/README.md
/jimmy/css/style.css
/jimmy/images/flower.gif
/jimmy/index.php
/jimmy/testDir/anotherTestDir/test2.php
/jimmy/listing.txt

然后我需要排序字符串,并将其添加到mysql数据库。任何关于如何实现这一效果的帮助将不胜感激。一旦我有了我的flatten数组,我想把它添加到用户的"文件夹"表。

<?php
$d = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/path/to/dir'));
foreach($d as $file){
        if($file->isFile()) echo $d->getSubPathname().PHP_EOL;
}

如果你真的读了这个问题,这些"文件"不是在本地文件系统(或任何文件系统)上,而是在数据库中存储的虚拟树中,所以在这种情况下,Iterator的例子并没有直接的用处。

如果您为数据库结构编写文件流包装器,则可以使用该示例。但即使这样,你也会陷入一个艰难的递归SQL查询(让你的数据库服务器"构建"你计算字段中的字符串,这就是我来这里希望找到的…),或者在PHP中大量的CPU时间通过结构来整理生成每个文件或文件夹的"长名称"。

然而,如果你只是想用数据作为输入,你可以使用一个循环和一些is_numeric()或is_string()逻辑(尽管你不能有一个目录是数字,这可能是或可能不是一个问题)…或者通过它们没有数组子结点来检测叶结点然后你就知道那是一个"文件"父结点都是"文件夹"不管数组索引"数据类型"是什么。对于像这样的递归数组,我通常使用引用循环,特别是如果我要修改节点(或在树中添加元素,例如每个节点的'full_path'字段)。在PHP文档站点关于引用和解引用的页面上有一些很好的例子。此外,如果您的数据集永远不会很大,这可能是可以接受的。在我的项目中,它不会,我们已经达到了一些资源限制,并且在每个"命中"到我们的文件管理器界面中需要花费太长时间来处理。因此,我强烈建议让数据库来完成繁重的工作和字符串连接(然后告诉我您是如何做到的!)