我有一个图像库的导入脚本,可以根据“images”目录填充数据库。在我最终弄清楚如何正确使用RecursiveIteratorIterator之后,填充工作正常。不幸的是,它没有考虑sub-subalbums。
<?php
$dir = "/home/photofoli/domains/dev.photofolio.local/public_html/photo";
$ir = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$album_id = 0;
$image_id = 0;
foreach(new RecursiveIteratorIterator($ir, RecursiveIteratorIterator::SELF_FIRST) as $iterator) {
$realpath = $iterator->getRealPath();
if ($iterator->isDir()) {
// Counting
$numberofpictures = 1;
$lastalbumid = $album_id;
$album_id++;
// SQL
$albumname = $iterator->getFileName();
$addslashes = addslashes($albumname);
$albumslug = str_replace(' ','-',$addslashes); $albumslug = strtolower($albumslug);
$sql = "INSERT INTO `photofoli_db`.`albums` (`name`, `id`, `path`, `album_id`, `image_count`, `slug`) VALUES ('$addslashes', $album_id, '$addslashes', '1', $numberofpictures, '$albumslug');";
$this->Album->query($sql);
}
else {
// Counting
$numberofpictures++;
$image_id++;
// SQL
$imagename = $iterator->getFileName();
$imagepath = $albumname.'/'.$iterator->getFileName();
$addslashes = addslashes($imagepath);
$sql = "INSERT INTO `photofoli_db`.`images` (`path`, `album_id`, `description`, `id`) VALUES ('$addslashes', $album_id, '$imagename', $image_id);";
$this->Image->query($sql);
}
}
?>
如何调整脚本以允许子子相册?我正在考虑保存$ lastAlbumID甚至计算完整路径中的'/'数量,但有些事情告诉我,我应该请求帮助重新考虑脚本的设计。
路径示例:
/images/album1/test.jpg
/images/album1/test5.jpg
/images/album2/test.jpg
/images/album1/subalbum/test.jpg (this is a problem, because it's in a sub-sub directory)
免责声明:我使用脚本重新填充数据库的原因是因为上传300个文件以重新运行脚本比手动添加300个新图像更快。
答案 0 :(得分:0)
您可以将这段代码包含在接受目录路径的函数中:每当找到子目录时,您都可以递归调用此函数。
答案 1 :(得分:0)
我会这样做
$ritit = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS)
);
$map = array();
foreach ($ritit as $splFileInfo) {
$dir = dirname($splFileInfo->getRealPath());
$map[ $dir ][] = $splFileInfo->getFileName();
}
print_r($map);
它生成一个dir是键的映射,值是该目录的直接子节点的文件名。
在结果数组上循环,计算并插入数据库应该是蛋糕。