通过优先级扩展集获取每种基本名称的一种类型

时间:2014-05-02 07:51:03

标签: php

我有一组看起来像这样的文件:

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()解决方案也没关系。但即便如此,我个人也无法想到更好的解决方案..

2 个答案:

答案 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;
    }
}