从目录的子目录创建一个双数组,然后是文件

时间:2014-07-10 23:07:45

标签: php file-io subdirectory

我有一个名为images的目录,其中包含子目录。每个子目录都包含图像。我想要做的是写一个函数,它返回一个索引为$images[$subDirectory][$fileName]的双数组,以便稍后对它们进行迭代。

我尝试编写下面的代码似乎工作正常,但我必须添加如下代码:

if ($subName === "." || $subName === ".." || $subName === ".DS_Store") continue;

这让我觉得我做错了什么。有没有更好的方法来解决这个问题,或者这只是解决方案的必要部分?

function getImages($inDirectory) {
    if (!is_dir($inDirectory))
        failureExit("Not a directory: ".$inDirectory);

    if (!$dir = opendir($inDirectory))
        failureExit("Could not open: ".$inDirectory);

    $out = array();
    while (($subName = readdir($dir)) !== false) {
        if ($subName === "." || $subName === ".." || $subName === ".DS_Store") continue;
        if (is_dir($inDirectory."/".$subName)) {
            if (!$subDir = opendir($inDirectory."/".$subName))
                failureExit("Could not open: ".$inDirectory."/".$subDir);

            $out[$subName] = array();
            while (($subSubName = readdir($subDir)) !== false) {
                if ($subSubName === "." || $subSubName === ".." || $subSubName === ".DS_Store") continue;
                $out[$subName][$subSubName] = 0;
            }
            closedir($subDir);
        }
    }
    closedir($dir);

    return $out;
}

$images = getImages("images");
print_r($images);

1 个答案:

答案 0 :(得分:1)

如果您使用RecursiveDirectoryIterator,则可以利用SKIP_DOTS标记跳过...,但是,您仍然需要指定任何自定义目录,例如作为您要跳过的.DS_Store

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(".",FileSystemIterator::SKIP_DOTS)
);

#note the leading './'
$skip_paths = array('./.DS_Store','./.SKIP_ME'); 
$images = array();

#$image an SPLFileInfo object
#http://php.net/manual/en/class.splfileinfo.php
foreach ($iterator as $image) {
    if($iterator->getDepth() === 1 && !in_array($image->getPath(),$skip_paths))
        $images[$image->getPath()][$image->getFilename()] = $image;
}

print_r($images);