2015-08-10 3 views
1

У меня возникла эта проблема.Рекурсивная функция PHP - увеличение общих значений

Предположим, что у меня есть серия папок внутри этих папок, у них есть неограниченное количество подпапок, и вы можете иметь неограниченное количество файлов в этом.

Используя Recusion, я пытаюсь получить количество всех файлов, которые существуют в подкаталогах, а также получить общее количество файлов из подзаголовка.

Я использую следующие:

$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

Если вы рекурсии через каталоги, которые вы должны взглянуть на некоторых из РНР построенный в классах, например ['РекурсивныйDirectoryIterator'] (http://php.net/manual/en/class.recursivedirectoryiterator.php), который помогает в этом. –

ответ

1

Я не уверен, что правильно читаю код, но для меня кажется, что вы пытаетесь изменить значение внутри функции, но тогда значение не возвращается за его пределами. В основном вы должны передать свой параметр по ссылке (используя &) вместо значения (это то, что вы здесь делаете), или лучшим вариантом будет рефакторинг вашего кода, чтобы ваша функция возвращала значение вместо того, чтобы пытаться изменить один. Кажется, это проблема для меня.

+0

Большое вам спасибо за это! Я забыл, что могу пройти по ссылке на стоимость .. Как глупо, но спасибо :) - Принятый ответ – Phorce

1

Существует два часто используемых метода для рекурсивно ходячих каталогов в PHP. Прежде всего, используя либо glob, либо RecursiveDirectoryIterator/RecursiveIteratorIterator.

Между ними метод итератора является более прямым представлением перемещения файлов. Попытайтесь привыкнуть к использованию итераторов, если сможете.

Общий Рекурсивный Glob Метод (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 
Смежные вопросы