我正在尝试列出指定目录中的所有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;
}
答案 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文件
<强>输出:强>
P.S。如果您希望该函数返回找到的.php
文件的完整路径,请从此行中删除basename()
:
$files[] = basename($item);
这将产生如下结果:
希望这会有所帮助。
答案 2 :(得分:-1)
您的主要问题是scanDir
或isDir
等功能需要完整的文件路径才能正常工作。
如果您将完整的文件路径传递给它们,它应该可以正常工作。