PHP列表目录递归发布

时间:2014-06-27 09:01:23

标签: php

我正在尝试列出指定目录中的所有PHP文件,并以递归方式检查所有子目录,直到找不到它为止,可能会有很多级别。

我下面的函数可以正常工作,只有它只能递归到一个级别。

我花了好几个小时试图查看我出错的地方,当它找到一个新目录时我正在调用scanFiles(),但这似乎只能工作一级并停止,任何帮助都非常感激。

更新

function scanFiles($pParentDirectory)
{
    $vFileArray = scandir($pParentDirectory);
    $vDirectories = array();

    foreach ($vFileArray as $vKey => $vValue)
    {
        if (!in_array($vValue, array('.', '..')) && (strpos($vValue, '.php') || is_dir($vValue)))
        {
            if (!is_dir($vValue))
                $vDirectories[] = $vValue;
            else
            {
                $vDirectory = $vValue;
                $vSubFiles = scanFiles($vDirectory);
                foreach ($vSubFiles as $vKey => $vValue)
                        $vDirectories[] = $vDirectory.DIRECTORY_SEPARATOR.$vValue;
            }
        }
    }

    return $vDirectories;
}

3 个答案:

答案 0 :(得分:0)

这是因为$vDirectory只是一个文件夹名称,因此scanDir会在当前文件夹中查找它,而不是子文件夹。

您要做的是传递文件夹的路径,而不仅仅是名称。这应该就像将递归调用更改为scanFiles($pParentDirectory . DIRECTORY_SEPARATOR . $vDirectory)

一样简单

答案 1 :(得分:0)

你可以这样轻松地做到这一点:

// helper function
function getFiles(&$files, $dir) {
    $items = glob($dir . "/*");
    foreach ($items as $item) {
         if (is_dir($item)) {
            getFiles($files, $item);
        } else {
            if (end(explode('.', $item)) == 'php') {
                $files[] = basename($item);
            }
        }
    }
}

// usage
$files = array();
getFiles($files, "myDir");

// debug
var_dump($files);

myDir 看起来像这样:在所有目录中都有php文件

enter image description here

<强>输出:

enter image description here


P.S。如果您希望该函数返回找到的.php文件的完整路径,请从此行中删除basename()

$files[] = basename($item);

这将产生如下结果:

enter image description here

希望这会有所帮助。

答案 2 :(得分:-1)

您的主要问题是scanDirisDir等功能需要完整的文件路径才能正常工作。

如果您将完整的文件路径传递给它们,它应该可以正常工作。