我遇到了这个问题。
假设我有一系列文件夹,在这些文件夹中,他们拥有无限量的子文件夹,你可以在其中拥有无限量的文件。
使用Recusion,我试图获取子目录中存在的所有文件的数量,以及这个,直接从子sub获取文件的总数。
我使用以下内容:
$SubSectionTotalCount = 0;
$SubSectionComplete = 0;
function GetStats($child, $groups, $progress, $resCount, $complete)
{
foreach($child->children as $childElement)
{
if($childElement->resources != null)
{
foreach($childElement->resources->groups as $groupss)
{
if(Check($groupss->id, $groups))
{
if(array_key_exists($childElement->parent_id, $progress))
{
if(array_key_exists($childElement->resources->id, $progress[$childElement->parent_id]['tasks']))
{
$complete++;
}
}
$resCount++;
var_dump($resCount);
}
}
}
GetStats($childElement, $groups, $progress, $resCount, $complete);
}
}
我目前有4个部分(因此resCount
应打印4个)但相反,我得到了:
int 1
int 2
int 3
int 2
如果我不增加变量,只需var_dump("getting here")
,我会得到以下内容:
Getting here
Getting here
Getting here
Getting here
所以递归是有效的,但我不明白为什么递增不会产生所需的输出?
答案 0 :(得分:1)
我不确定我是否正确地读取了您的代码,但对我而言,您似乎正在尝试修改函数内部的值,但之后该值不会返回到它之外。 基本上你应该通过引用传递参数(使用&)而不是通过值传递(这是你在这里做的),或者更好的选择是重构你的代码,以便你的函数返回一个值,而不是试图改变一。这似乎是我的问题。
答案 1 :(得分:1)
在PHP中递归遍历目录有两种常用方法。主要使用glob或RecursiveDirectoryIterator / RecursiveIteratorIterator。
在两者之间,迭代器方法是文件遍历的更直接表示。如果可以的话,尽量习惯使用迭代器。
Common Recursive Glob Method(PHP 4 +)
function getAllFiles($pattern)
{
$files = glob($pattern, 0);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
$files = array_merge($files, getAllFiles($dir.'/'.basename($pattern), 0));
return $files;
}
$numFiles = count( getAllFiles('*') );
通用递归迭代器方法(PHP 5 +)
$dirIterator = new RecursiveDirectoryIterator('/path');
$iterator = new RecursiveIteratorIterator(
$dirIterator,
RecursiveIteratorIterator::SELF_FIRST
);
$numFiles=0;
foreach ($iterator as $file) ++$numFiles; //If you need to access files also.
$numFiles=iterator_count($iterator); //If you only want the count