Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Помогите найти ошибку в цикле


Автор: Alek74 18.4.2006, 14:03
Помогите найти ошибку в цикле и, если можно, то объяснить.

Есть функция определяющая размер заданной папки. Функцию писал не я. 

Код
function show_size($d,$format=true)
{
        if($format)
        {
        $size=show_size($d,false);
        if($size<=1024) return $size.' bytes';
        else if($size<=1024*1024) return round($size/(1024),2).' Kb';
        else if($size<=1024*1024*1024) return round($size/(1024*1024),2).' Mb';
        else if($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).' Gb';
        else if($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).' Tb'; //:)))
        else return round($size/(1024*1024*1024*1024*1024),2).' Pb'; // ;-)
        }else
        {
           if(is_file($d)) return filesize($d);
             $size=0;
             $dh=opendir($d);

               while(($file=readdir($dh))!==false)
                {
                  if($file=='.' || $file=='..') continue;

                   if(is_file($d.'/'.$file))

                  $size+=filesize($d.'/'.$file);

               else $size+=show_size($d.'/'.$file,false);
         }
        closedir($dh);
      return $size+filesize($d); // +filesize($d) for *nix directories
    }
}


Я решил поставить фильтр по маске файлов.

Код
               while(($file=readdir($dh))!==false)
                {
                  if($file=='.' || $file=='..') continue;

                  foreach (glob($d."/*.shtml") as $files) {

                   if(is_file($d.'/'.$file))

                  $size+=filesize($d.'/'.$file);

               else $size+=show_size($d.'/'.$file,false);
             }
         }


Но это естественно не работает. foreach проверяет есть ли вообще такой файл в каталоге, и ,если есть, то суммирует все. 

В общем я запутался в циклах. 

Автор: Ciber SLasH 19.4.2006, 01:51
В строке 5 пишешь $files, а в остальных строках $file 

Автор: Alek74 19.4.2006, 08:25
Код

$d = "test";

В том варианте который выше результат получаеться такой:

Код

Размер всех файлов:
alg.htm
car.gif
inde.html
inde.shtml
main1_small.jpg
test.htm
794.41 Kb


Если изменить $files на $file, то результат выглядит так:
Код

Размер всех файлов:
f:/server/info/1/test/inde.shtml
f:/server/info/1/test/inde.shtml
f:/server/info/1/test/inde.shtml
f:/server/info/1/test/inde.shtml
f:/server/info/1/test/inde.shtml
f:/server/info/1/test/inde.shtml
0 bytes


А почему? В чем суть ошибки? Именно суть. Я хочу понять.


_  

Автор: sugee 19.4.2006, 10:31
Ну почему inde.shtml выводится 6 раз это понятно.
У тебя цикл  foreach внутри цикла while, значит на каждой итерации цикла while
ты просматриваешь всю папку и находишь там один файл, соответствующий твоей маске.
 

Автор: Alek74 19.4.2006, 10:37
А тогда вопрос такой - а нужно ли вообще использовать цикл foreach?

Добавлено @ 10:39 
Можно ли использовать glob без foreach? В уже имеющимся цикле? 

Автор: sugee 19.4.2006, 10:46
Цитата(Alek74 @  18.4.2006,  14:03 Найти цитируемый пост)
$size+=filesize($d.'/'.$file);

Так у тебя же в $files и так содержится полный путь к файлу.
Так должно получитсья
Код

$size+=filesize($files);


Добавлено @ 10:53 
Так ты можешь всё это
Код

             $dh=opendir($d);

               while(($file=readdir($dh))!==false)
                {
                  if($file=='.' || $file=='..') continue;
заменить на твой foreach,  он сам откроет папку и переберёт её.

Добавлено @ 10:54 
http://ru.php.net/manual/ru/function.glob.php 

Автор: Alek74 19.4.2006, 11:57
Цитата
 
Так ты можешь всё это
Код

             $dh=opendir($d);

               while(($file=readdir($dh))!==false)
                {
                  if($file=='.' || $file=='..') continue;
заменить на твой foreach,  он сам откроет папку и переберёт её.


Не получаеться. Можно подробней? 

Автор: sugee 19.4.2006, 18:54
Код

foreach (glob($d."/*.shtml") as $files) {

    $size+=filesize($files);
    echo $files."<br>";
}
echo $size;
Если конечно мануал не врёт  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)