【问题标题】:Populating a database iterating a directory and deep directory structure填充数据库迭代目录和深层目录结构
【发布时间】:2012-11-04 00:27:02
【问题描述】:

我有一个图片库的导入脚本,用于根据“图片”目录填充数据库。在我终于弄清楚如何正确使用 RecursiveIteratorIterator 之后,填充工作正常。不幸的是,它没有考虑子专辑。

<?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 个新图像更快。

【问题讨论】:

  • 使用RecursiveDirectoryIteratorRecursiveIteratorIterator 应该会生成一个包含任意深度路径中所有文件和文件夹的“扁平化”数组,因此您的脚本应该已经看到了子专辑。跨度>

标签: php database algorithm file import


【解决方案1】:

您可以将这段代码包含在一个接受目录路径的函数中:无论何时找到子目录,您都可以递归调用该函数。

【讨论】:

    【解决方案2】:

    我会这样做

    $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 是键,值是作为该 dir 的直接子级的文件名。

    循环遍历生成的数组,计数并插入数据库应该是小菜一碟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 2014-11-25
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多