使用数组值查找目录中的文件?

时间:2014-06-11 13:32:25

标签: php

我有一个数组,其值是图像名称:

Array
(
    [rocks] => rocks.jpg
    [stone] => stone.jpg
    [bird] => bird.jpg
    ...
) 

我想扫描3个目录,这些目录都在同一个文件夹中,并匹配任何匹配任何数组值的图像。目录结构如下:

images
    nature
    animals
    misc.

我知道scandir()但不确定如何考虑多个目录。我最终想将这些匹配的图像复制到一个新目录中。这可以用PHP吗?

任何想法或例子都会非常有帮助。

感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用glob查找文件,但您将在某种程度上仅限于当前结构。

例如:

$files = [];
foreach($filenames as $filename) {
 $files = array_merge($files, glob('images/*/'.$filename));
}

glob会搜索匹配' $ filename'在图像的任何子目录中。如果你想要比这更深入,你必须创建一个递归函数。

答案 1 :(得分:1)

您可以简单地使用两个嵌套循环:

foreach(array_values($images) as $img) {
    foreach(array(
        'images/nature',
        'images/animals',
        'images/misc.'
    ) as $path) {
        if(file_exists("$path/$img")) {
            echo "file $path/$img exists" . PHP_EOL;
        }
    }
}

答案 2 :(得分:1)

您可以在PHP中使用file_exists函数。像这样:

$directories = array('nature', 'animals', 'misc.');
$found_images = array();
foreach ($image_names as $image) {
    foreach ($directories as $dir) {
        if (file_exists('images/' . $dir . '/' . $image) {
            $found_images[] = 'images/' . $dir . '/' . $image;
        }
    }
}

在此之后,$found_images将包含找到的所有图像的路径。

要将文件复制到另一个目录,只需使用copy

foreach ($found_images as $image) {
    copy($image, 'DESTINATION_DIRECTORY/' . basename($path));
}

答案 3 :(得分:0)

这会将目录内的所有文件(递归)加载到数组

$FILES = array();

function listFolderFiles($dir){
    global $FILES;

    $ffs = scandir($dir);
    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            if(is_dir($dir.$ff))
                listFolderFiles($dir.$ff.'/');
            else{
                $FILES[] = $dir.$ff;
                if(in_array($ff, $my_array))
                {
                    copy('source_dir'.$ff, 'destination_file');
                    // do your stuff here
                }
            }
        }
    }
}

listFolderFiles('your_dir');

:)尽情享受!