3

original/とthumbs/の2つの画像フォルダがありますが、ファイル数が異なる(thumbs /の数が少ない)ので、欠落している画像を見つける必要があります。ファイル名はまったく同じです。両方のフォルダを比較して、不足している画像のリストを出力しますか?

アップデート:

答えはどれも私が望んでいたことをしていないようでしたが、私はこの非常に大雑把な答えを思いつきました

使用しないことをお勧めします!!

ボディに暗い背景を与えてから、明るい目立つ色でimgをスタイリングします。

<style>
    body{background:#000;}
    img {height:10px;width:10px;background:pink;border:1px solid #ccc;padding:10px;margin:5px;}
</style>

PHP:

// Read dir ...
        $images = glob('original/{*.jpg,*.gif,*.png}', GLOB_BRACE);

// throw out a foreach ...
        foreach($images as $image) 
         {

// using str_replace switch folders 
          $image  = str_replace('original/', 'thumbs/', $image);

// echo result 
          $result = '<img src="' . $image . '" alt="m" />';
          echo $result;
}

長い間待って、システムをほぼ強制終了した後、すべての画像が表示されます。今度は、それぞれを見て、不足している画像を見つけます。

ここで結果を参照してください: http ://s12.postimage.org/5kcsvs48r/missing.jpg

私が言ったように、これはそれを行うための非常に大雑把な方法であり、非常にサーバーを集中的に使用します。おそらく数枚の画像であれば問題ありませんが、読んで簡単に見つけることができますが、とにかくこれまでに言ったように、8000枚以上の画像がありましたはお勧めできませんが、とにかく良いか悪いかで答えを共有したいと思いました。

4

5 に答える 5

6

開始方法:

$original = array_map('basename', glob('original/*.{jpg,gif,png}', GLOB_BRACE));
$thumbs = array_map('basename', glob('thumbs/*.{jpg,gif,png}', GLOB_BRACE));
$missing_thumbs = array_diff($original, $thumbs);
$missing_original = array_diff($thumbs, $original);

編集注:配列にはパス名が含まれarray_diff()ているため、ここでは機能しないことを見逃していました...マッピングでパッチが適用され、期待どおりに機能するようになりました。glob()basename()

于 2012-07-06T16:21:43.480 に答える
1

php.netには、ディレクトリを通過する方法に関する多くのドキュメントとディスカッションがあります(、、などをscandir()参照readdir()glob()

例1

この例では、フラットディレクトリ(サブディレクトリなし)を読み取り、それらを比較して、結果を最後の配列に残します。

$original = glob('path/to/original/*.*');
$thumbs   = glob('path/to/thumbs/*.*');

$missing = array('original' => array(), 'thumbs' => array());

$missing['original']   = array_diff($thumbs, $original);
$missing['thumbs'] = array_diff($original, $thumbs);

print_r($missing); // Prints out a sorted array of the missing files for each dir

この例の問題は、どちらかのフォルダーにサブフォルダーがある場合です。これを処理するには、次のような再帰構造を使用する必要があります。


例2

この例では、再帰を利用して、およびのすべてのサブディレクトリから欠落しているすべてのファイルを検索します。thumbs/original/

/* Returns an associative array of all files under a directory,
including those inside of sub-directories, using recursion */
function scan($path) {
  $dir = opendir($path);
  
  while(false !== ($f = readdir($handle)))
    if(is_dir($f))
        $files[$f] = scan($path.$f.'/');
      else
        $files[$f] = $f;
    
    return $files;
  }

$original = scan('path/to/original/');
$thumbs = scan('path/to/thumbs/');

$missing['thumbs'] = array_diff($original, $thumbs);
$missing['original'] = array_diff($thumbs, $original);

print_r($missing);
print_r($original);
print_r($thumbs);
于 2012-07-06T16:42:55.097 に答える
0

以下はwww.php.net/opendir/からの引用です:

// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
        }
        closedir($dh);
    }
}

両方のディレクトリに対してこれを行い、ファイル名をエコーする代わりに別々の配列に配置できます。次に、配列を比較して不足しているファイルを見つけます。

于 2012-07-06T16:17:23.823 に答える
0
$originalsDir = 'path';
$originalsArray = array();
if ($handle = opendir($originalsDir)) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry == '.' || $entry == '..') {
            continue;
        }
        $originalsArray[] = $entry;
    }
    closedir($handle);
} else {
    die('Could not open originals dir: ' . $originalsDir);
}
$thumbsDir = 'path';
$thumbsArray = array();
if ($handle = opendir($thumbsDir)) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry == '.' || $entry == '..') {
            continue;
        }
        $thumbsArray[] = $entry;
    }
    closedir($handle);
} else {
    die('Could not open thumbs dir: ' . $thumbsDir);
}

$missingThumbs = array_diff($originalsArray, $thumbsArray);

array_diff()opendir()readdir()を参照してください

于 2012-07-06T16:17:40.330 に答える
0
$dir_files1 = array();
$dir_files2 = array();

//Do this twice, Once for each directory
if ($handle = opendir('/path/to/files1')) {
    echo "Directory handle: $handle\n";
    echo "Entries:\n";

    /* This is the correct way to loop over the directory. */
    while (false !== ($entry = readdir($handle))) {
        $dir_files1[] = $entry;
    }
}

//Then compare the two arrays with eachother
foreach($dir_files1 as $d1)
{
 $match =false;
 foreach($dir_files2 as $d2)
 {
    if($d1==$d2)
     $match=true;
 }
 if(!$match)
   do_something();
}
于 2012-07-06T16:27:56.147 に答える