[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Зацикленность функции: в чем ошибка?
baston
Очередная проблема с моей логикой в применении циклов. Есть задача: подсчитать количество файлов в папке (включая вложенные папки). Нужно использовать рекурсивную функцию.
Делаю так (код ниже), но возникает зацикленность.
К тому же, не могу сообразить, как и где должен быть в этом случае счетчик файлов. Ведь при рекурсии он обнулится...
Подскажите, прошу.
$dirname = "c:/Download";
function finc($directory)
{
//Счетчик файлов
$file_count = 0;
//Читаем содержимое каталога в массив
$arr = scandir($directory);
foreach($arr as $file)
{
if(is_file("$directory/$file")) ++$file_count;
else if (is_dir("$directory/$file") && $file != "." || $file != "..")
{
finc("$directory/$file");
}
}
return $file_count;
}
echo finc($dirname);




Спустя 8 минут, 38 секунд (8.03.2010 - 20:29) krasilich написал(а):

$dirname = "c:/Download";
function finc($directory)
{
//Счетчик файлов
$file_count = 0;
//Читаем содержимое каталога в массив
$arr = scandir($directory);
foreach($arr as $file)
{
if(is_file("$directory/$file")) ++$file_count;
else if (is_dir("$directory/$file") && ($file != "." || $file != ".."))
{
$file_count += finc("$directory/$file");
}
else
continue
;
}
return $file_count;
}
echo finc($dirname);

Спустя 17 минут (8.03.2010 - 20:46) baston написал(а):
see_man
Спасибо, но зацикленность осталась... Проверял на папке с двумя файлами и вложенной папке с одним файлом. Должно было показать 3, а цикл, цикл, цикл...

Спустя 20 минут, 16 секунд (8.03.2010 - 21:06) twin написал(а):
$file != "." && $file != ".."

А зачем там continue; ?

Спустя 4 минуты, 48 секунд (8.03.2010 - 21:11) DedMorozzz написал(а):
у тя ф-я сама ся внутри себя же вызывает. естесно циклит!

Спустя 6 минут, 24 секунды (8.03.2010 - 21:17) baston написал(а):
Согласен. Значит, другая логика должна быть.

Спустя 35 минут, 19 секунд (8.03.2010 - 21:53) baston написал(а):
Вот так сработало:
$dirname = "c:/Download";
function finc($directory)
{
$file_count = 0;
$dir = opendir($directory);
while($file = readdir($dir))
{
if(is_file("$directory/$file")) ++$file_count;
else if(is_dir("$directory/$file") && $file != "." && $file != "..")
{
$file_count += finc("$directory/$file");
}
}
closedir($dir);
return $file_count;
}
echo finc($dirname);

Спустя 14 минут, 22 секунды (8.03.2010 - 22:07) baston написал(а):
Собственно, сработала и мой предыдущий скрипт. Я изменил оператор || на && (и).
<?php
$dirname = "c:/WINDOWS";
function finc($directory)
{
//Счетчик файлов
$file_count = 0;
//Читаем содержимое каталога в массив
$arr = scandir($directory);
foreach($arr as $file)
{
if(is_file("$directory/$file")) ++$file_count;
else if (is_dir("$directory/$file") && $file != "." && $file != "..")
{
$file_count += finc("$directory/$file");
}
}

return $file_count;
}
echo finc($dirname);

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.