-1

「images」ディレクトリに基づいてデータベースにデータを取り込むための画像ギャラリーのインポートスクリプトがあります。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個のファイルをアップロードしてスクリプトを再実行する方が速いためです。

4

2 に答える 2

0

このコードをディレクトリパスを受け入れる関数に含めることができます。サブディレクトリが見つかると、この関数を再帰的に呼び出すことができます。

于 2012-11-15T12:02:00.197 に答える
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がキーであり、値がそのdirの直接の子であるファイル名であるマップを生成します。

結果の配列をループし、カウントしてデータベースに挿入するのは簡単なことです。

于 2012-11-15T17:02:52.840 に答える