问题描述
我正在制作一个“照片上传”项目,可以获取特定文件夹的所有子文件和子目录。
我使用 iterator
来获取文件和目录:
$path = dirname(__FILE__).'/';
use RecursiveIteratorIterator as RII;
use RecursiveDirectoryIterator as RDI;
use RecursiveCallbackFilterIterator as RCFI;
$directory = new RDI($path,RDI::SKIP_DOTS);
$filter = new RCFI($directory,function ($current,$key,$iterator) {
return $current->isDir() || preg_match('/^.+(.jpe?g|.png|.gif)$/i',$current->getPathname()) > 0;
});
$iterator = new RII($filter,RII::SELF_FirsT);
得到它们后,我想将它们的结构存储到数据库中,放入下表中:column `id` is AUTO_INCREMENT
table `item`
| id | title | type | parent_id |
像Unix一样,一切都是文件,甚至目录,我使用列type
来存储文件夹或文件,所以我只能使用一张桌子。
例如,我有两个文件和两个文件夹:
test (folder)
-file1.png
-subtest (folder)
--file2.png
我想像这样存储它们(例如,它们的顺序并不重要):
| id | title | type | parent_id |
-----------------------------------------
| 1 | test | folder | null |
| 2 | file1.png | file | 1 |
| 3 | subtest | folder | 1 |
| 4 | file2.png | file | 3 |
我知道如何获得 我不知道如何将每个文件夹及其父文件夹结构放入数组中,然后将它们存储到上面的表格中
解决方法
终于找到了解决方案(谢谢u/colshrapnel):
最简单的方法是手动维护目录映射。假设插入测试目录后,您将获得 id 并将完整路径存储在数组中,$map[$current->getPathname()] = 1;
等等。获得新条目后,获取 dirname($current->getPathname())
并针对地图对其进行测试以获取父 ID
因此 test/subtest
应该给你 3