PHP递归函数 - 递增总值

时间:2015-08-10 15:02:08

标签: php recursion

我遇到了这个问题。

假设我有一系列文件夹,在这些文件夹中,他们拥有无限量的子文件夹,你可以在其中拥有无限量的文件。

使用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 

所以递归是有效的,但我不明白为什么递增不会产生所需的输出?

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确地读取了您的代码,但对我而言,您似乎正在尝试修改函数内部的值,但之后该值不会返回到它之外。 基本上你应该通过引用传递参数(使用&)而不是通过值传递(这是你在这里做的),或者更好的选择是重构你的代码,以便你的函数返回一个值,而不是试图改变一。这似乎是我的问题。

答案 1 :(得分:1)

在PHP中递归遍历目录有两种常用方法。主要使用globRecursiveDirectoryIterator / 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