Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку в цикле 
:(
    Опции темы
Alek74
Дата 18.4.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Помогите найти ошибку в цикле и, если можно, то объяснить.

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

Код
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 проверяет есть ли вообще такой файл в каталоге, и ,если есть, то суммирует все. 

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

Это сообщение отредактировал(а) Alek74 - 18.4.2006, 14:05
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
Ciber SLasH
Дата 19.4.2006, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 3
Всего: 67



В строке 5 пишешь $files, а в остальных строках $file 
PM   Вверх
Alek74
Дата 19.4.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Код

$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


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


_  

Это сообщение отредактировал(а) Alek74 - 19.4.2006, 08:28
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
sugee
Дата 19.4.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



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

Это сообщение отредактировал(а) sugee - 19.4.2006, 10:34
PM MAIL   Вверх
Alek74
Дата 19.4.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



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

Добавлено @ 10:39 
Можно ли использовать glob без foreach? В уже имеющимся цикле? 
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
sugee
Дата 19.4.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Цитата(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 

Это сообщение отредактировал(а) sugee - 19.4.2006, 10:48
PM MAIL   Вверх
Alek74
Дата 19.4.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.3.2006

Репутация: нет
Всего: нет



Цитата
 
Так ты можешь всё это
Код

             $dh=opendir($d);

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


Не получаеться. Можно подробней? 
--------------------
---------------------------------- «Филисофия жизни ©»  ---------------------------------- 
PM MAIL   Вверх
sugee
Дата 19.4.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Код

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

    $size+=filesize($files);
    echo $files."<br>";
}
echo $size;
Если конечно мануал не врёт  smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.