也许有比PHP路线更好的方法,我对这些想法持开放态度。
问题:我有每个用户的文件夹结构。此文件夹可能包含文件或子文件夹。我只关心有文件的文件夹。我能够运行查询并在多维数组上获得递归列表(来自Web上发布的PHP代码)。问题是我得到了一个多维数组,当扁平化时只列出最内层的文件名,我需要在sql dbase中存储路径和文件 - 或者路径+文件。这个想法是允许用户查看他的文件并使用Web界面删除它们。
以下是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中。任何有关如何实现这种效果的帮助将非常感激。一旦我拥有了flatten数组,我想将其添加到用户的“文件夹”表中。
答案 0 :(得分:3)
<?php
$d = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/path/to/dir'));
foreach($d as $file){
if($file->isFile()) echo $d->getSubPathname().PHP_EOL;
}
答案 1 :(得分:0)
如果您确实阅读了这个问题,这些“文件”不在本地文件系统(或任何文件系统)上,而是存储在数据库中的虚拟树中,因此Iterator示例在这种情况下并不直接有用。
但是,如果为数据库结构编写文件流包装器,则可以使用该示例。但即便如此,你仍然会陷入艰难的递归SQL查询(让你的数据库服务器“构建”你计算字段中的字符串,这就是我来这里希望找到的......)或大量的CPU时间在PHP中整理结构以生成每个文件或文件夹的“长名称”。
但是,如果你只想将数据作为输入,你可以使用一个循环和一些is_numeric()或is_string()逻辑(虽然你不能有一个数字的目录,这可能是也可能不是是一个问题)...或者通过他们没有数组子子的事实来检测叶子,然后你知道这是一个'文件'而父母都是'文件夹'而不管数组索引“数据类型”。对于像这样的递归数组,我通常使用by-reference循环,特别是如果我将修改节点(或在树中添加元素,例如每个节点的'full_path'字段)。关于引用和解除引用的页面,在PHP doc站点上有一些很好的例子。此外,如果您的数据集永远不会很大,这可能会令人满意。在我的项目中它不会,我们已经达到了一些资源限制,并且在我们的文件管理器界面的每次“点击”内处理时间太长。所以我强烈建议让数据库完成繁重的工作和字符串连接(然后告诉我你是如何做到的!)