我有一组看起来像这样的文件:
image01.png
image01.jpg
image02.png
image02.jpg
image03.png
image03.jpg
image03.gif
有人能想到一种更好的方法,只能从每个集合中获取一个具有相同基本名称的文件,并基于优先级的扩展集合吗?我当前代码中的所有continue
语句看起来都不太好。而且我很肯定我会添加更多的文件类型,因此它不会变得更漂亮(或者更容易管理)。
while(($Filename = readdir($DirHandle)) !== FALSE){
$Ext = pathinfo($Filename, PATHINFO_EXTENSION);
$Basename = basename($Filename, '.'.$Ext);
switch($Ext){
case 'png':
// highest priority, we're good
break;
case 'jpeg':
case 'jpg':
// is there a higher-priority filetype with the same basename?
if(file_exists($Dir.'/'.$Basename.'.png'))
continue 2; // then, let's proceed to the next file
break;
case 'gif':
if(file_exists($Dir.'/'.$Basename.'.png'))
continue 2;
elseif(file_exists($Dir.'/'.$Basename.'.jpeg'))
continue 2;
elseif(file_exists($Dir.'/'.$Basename.'.jpg'))
continue 2;
break;
// etc. etc...
default:
// not a filetype we're interested in at all
continue 2;
}
}
scandir()
解决方案也没关系。但即便如此,我个人也无法想到更好的解决方案..
答案 0 :(得分:0)
您可以简单地使用PHP的SPL Extensions..
$it_files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("images",FilesystemIterator::CURRENT_AS_SELF));
$images = array();
foreach ($it_files as $file) {
if(!array_key_exists(pathinfo($file)['filename'],$images) && exif_imagetype($file))
{
$images[pathinfo($file)['filename']]=pathinfo($file)['basename'];
}
}
print_r($images);
上面的代码递归检查images
目录下的所有文件。使用exif_imagetype
检查每个文件是否为图像,因此不必指定.jpg , .jpeg, .gif
等扩展名。
让我们考虑您在images
目录中提到的相同文件。首先,它会将image01.png
添加到$images
数组,因为它是一个图像,没有其他出现的是那里。现在,由于文件名匹配,因此不会添加image01.jpg
。现在,image02.png
将被添加..等等。
答案 1 :(得分:0)
由于我不仅处理图像(我可能应该首先说明),特别是通过扩展(由于某种原因),Shankar发布的解决方案不能真正起作用对我来说。
所以这就是我最终想出来的:
$PriExts = array('png','jpg','jpeg','gif');
// ...
if (!in_array($Ext, $PriExts)) continue;
$i = array_search($Ext, $PriExts);
while($i > 0){
if(file_exists($Dir.'/'.$Basename.'.'.$PriExts[--$i])){
continue 2;
}
}