我有两个图像文件夹原始/和拇指/但文件计数不同(拇指/较少)所以我需要找到哪些图像丢失,文件名完全相同IE没有前缀在拇指上,所以作为标题说如何比较两个文件夹并输出缺失图像的列表?
更新
没有一个答案似乎做了我想要的但是我想出了这个非常粗略的答案
不建议使用!!
我们给身体一个黑色的背景,然后用明亮的杰出颜色设计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张图像需要通过,无论如何我都喜欢之前说这是不可取的,但我想我会分享我的答案无论好坏。
答案 0 :(得分: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()
映射,现在它会按预期工作。
答案 1 :(得分:1)
php.net有很多关于如何浏览目录的文档和讨论(请参阅:scandir()
,readdir()
,glob()
等等。
此示例读取一个平面目录(没有子目录)并比较它们,最后将结果保留在数组中。
$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($orignal, $thumbs);
print_r($missing); // Prints out a sorted array of the missing files for each dir
此示例的问题是,如果您在任一文件夹中都有子文件夹。要处理这个问题,你必须使用如下的递归结构。
此示例利用递归通过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);
答案 2 :(得分: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);
}
}
您可以对两个目录执行此操作,并将文件名放在单独的数组中,而不是回显它们。然后比较数组以找到丢失的文件。
答案 3 :(得分: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);
答案 4 :(得分: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();
}