Помогите подсчитать значения в цикле.

zIP

Новичок
Помогите подсчитать значения в цикле.

Проходим циклом по папкам и выводим список файлов по определенной маске.

PHP:
function test ($d)        {
          foreach (glob($d."/*.shtml") as $file) {
          echo $file." : ".filesize($file)."<br>";

              }
           if(is_file($d)) return filesize($d);
             $dh=opendir($d);
               while(($file=readdir($dh))!==false)
                {
                  if($file=='.' || $file=='..') continue;
               else
            test($d.'/'.$file,false);
         }
        closedir($dh);
    }
Результат работы функции:

f:/server/info/1/test/alg.shtml : 453
f:/server/info/1/test/inde.shtml : 6468
f:/server/info/1/test/test2/alg2.shtml : 453
f:/server/info/1/test/test2/inde2.shtml : 6468
f:/server/info/1/test/test2/test3/alg3.shtml : 453
f:/server/info/1/test/test2/test3/inde3.shtml : 6468
f:/server/info/1/test/test2/test3/test4/alg4.shtml : 453
f:/server/info/1/test/test2/test3/test4/inde4.shtml : 6468
т.е цикл определяет все нужные файлы.
Но не могу сообразить как мне просуммировать размер найденных файлов.
 

Фанат

oncle terrible
Команда форума
пучть функция возвращает размер
его и складывай.
 

Splurov

Новичок
Что мешает создать дополнительную переменную и увеличивать её значение при каждой итерации цикла?
 

zIP

Новичок
Автор оригинала: Splurov
Что мешает создать дополнительную переменную и увеличивать её значение при каждой итерации цикла?
Я опять туплю.

PHP:
          foreach (glob($d."/*.shtml") as $file) {
          echo $file." : ".filesize($file)."<br>";
          $f=filesize($file);
          $size+=$f;
то у меня вылазиет не определенная переменная $size.
Если я ее перед этим циклом определяю $size = 0;
То счетчик считает только проход одного цикла и на второй итерации автоматическии обнуляет.
Мозги забуксовали. Не могу чисто логически понять.
 

rob72

Новичок
PHP:
<?php
	function test($d){
$total_size=0;
$dh=opendir($d); 
	while(($file=readdir($dh))!==false) {
	if(!is_file($file)||!eregi("\.shtml$",$file))continue;
	$total_size+=filesize($file);
	//Здесь выводим список, или еще что там делаем...
	} 
closedir($dh); 
return $total_size;
}//End_func
?>
Если я правильно понял, что тебе нужно...
 

zIP

Новичок
Автор оригинала: rob72
Если я правильно понял, что тебе нужно...
Нет, не правильно. Если есть вложенная папка, то функция выполняеться еще раз.
PHP:
      if($file=='.' || $file=='..') continue; 
               else 
            test($d.'/'.$file,false); 
         }
поэтому значения и обнуляються.
 

Splurov

Новичок
zIP
Опять же. Что мешает воспользоваться советом Фаната?
 

zIP

Новичок
Автор оригинала: Splurov
zIP
Опять же. Что мешает воспользоваться советом Фаната?
это самый простой вариант.
И есть вопрос - а не будет ли это слишком долго обрабатываться если файлов и папок много?
 

Splurov

Новичок
zIP
Другого варианта нету.
Не знаю, что для тебя слишком долго, но если файлов и папок очень много, то может и несколько секунд обрабатываться, по крайней мере на ntfs.
 

zIP

Новичок
Автор оригинала: rob72
Тогда переменную $total_size определяй вне функции, а внутри начинай с GLOBAL $total_size;
А все таки можно ли обойтись без глобальной переменной?
 

rob72

Новичок
А все таки можно ли обойтись без глобальной переменной?
во первых, не понимаю боязни глобальной переменной, но если уж так, оформи как класс и работай со свойством
 

Splurov

Новичок
zIP
Можно и без глобальной. Смысла в ней не вижу.
Покажи код, который ты написал с учётом советов данных в теме и который не работает.
 

zIP

Новичок
Автор оригинала: Splurov
zIP
Покажи код, который ты написал с учётом советов данных в теме и который не работает.
PHP:
function test ($d)        {
global $size;
          foreach (glob($d."/*.shtml") as $file) {
          echo $file." : ".filesize($file)."<br>";
          $f=filesize($file);
          $size+=$f;
              }
           if(is_file($d)) return filesize($d);
             $dh=opendir($d);
               while(($file=readdir($dh))!==false)
                {
                  if($file=='.' || $file=='..') continue;
               else
            test($d.'/'.$file,false);
         }
        closedir($dh);
      return $size;
    }
Если убрать $global то не работает.
И если не сложно то хотелось бы объяснение.
 

Splurov

Новичок
zIP
Прочитай ответ Фаната.
Тебе нужно:
Код:
$size+=test($d.'/'.$file,false);
 

rob72

Новичок
Я в своем коде не учитывал вложенные директории, но ты же говоришь, что проблема в одном - общий размер, а остальное работает. Вот в своем коде и сделай так: снаружи $total_size,
Внутри начинаешь с GLOBAL $total_size, а потом, какой файл ни встретишь, так сразу $total_size+=filesize($file)
А если нужно отдельно по директориям, то $total_size определяешь как массив: ключи-имена директорий, значения-
эти самые сумматоры типа $total_size
Разумеется, возвращать общий размер уже не нужно, просто бери $total_size
 

Фанат

oncle terrible
Команда форума
rob72
ему не нужны ни классы ни свойства.
если ты не знаешь базового синтаксиса пхп, то я вынужден попросить тебя не писать в эту тему больше
 

zIP

Новичок
Еще есть вопрос.
А можно ли задавать в glob() не одну маску файла? Именно через него, а не через регулярные? Это ток - чисто факультативно.
 
Сверху