0

也许有比 PHP 路线更好的方法,我对想法持开放态度。

问题:我为每个用户都有一个文件夹结构。此文件夹可能包含文件或子文件夹。我只关心有文件的文件夹。我能够运行查询并在多维数组上获得递归列表(来自网络上发布的 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 dbase。任何有关如何实现此效果的帮助将不胜感激。一旦我有我的扁平数组,我想一次将它添加到用户的“文件夹”表中。

4

2 回答 2

3
<?php
$d = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/path/to/dir'));
foreach($d as $file){
        if($file->isFile()) echo $d->getSubPathname().PHP_EOL;
}
于 2013-04-22T23:33:03.040 回答
0

如果您真的阅读了这个问题,这些“文件”不在本地文件系统(或任何文件系统)上,而是在存储在数据库中的虚拟树中,因此迭代器示例在这种情况下并不直接有用。

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

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

于 2013-05-17T18:31:28.390 回答