Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивный вызов. Ошибка в работе функции.
 
 автор: ck   (01.12.2005 в 11:42)   письмо автору
 
 

Граждане, помогите разобраться, в чем здесь ошибка. Вот код, цель которого вывести структуру вложенной папки - список каталогов и файлов. Он работает:

<html>
<head>
<title>&#210;&#229;&#241;&#242;</title>
<style><!--
a {
font-weight: bold;
color: blue;
}
//--></style>
</head>
<body>
<?php
function do_it ($dir)
{
$op opendir($dir);

while ((
$f readdir($op)) !== false)
{
$t "$dir/".$f;
if (
is_dir($t))
{
echo 
"<a>".$f."</a><br>";
}
}
$op2 opendir($dir);
while ((
$f readdir($op2)) !== false)
{
$t "$dir/".$f;
if (!
is_dir($t))
{
echo 
$f."<br>";
}
}

}
$name "black";
do_it($name);
?>
</body>
</html>

Но когда я попытался добавить в него рекурсивный вызов функции, (т.е., в случае, если рассматриваемый в цикле while объект - папка, - снова вызывается функция do_it и принимает эту папку в качестве аргумента), результатом оказался сначала вертикальный ряд из нескольких сотен точек, затем экран мигнул, появилось "Невозможно отобразить страницу".
На всякий случай привожу тот фрагмент кода, где происходит рекурсия:

while (($f = readdir($op)) !== false)
{
$t = "$dir/".$f;
if (is_dir($t))
{
echo "<a>".$f."</a><br>";
do_it($t);
}
}

Большое спасибо всем ответившим.
PS.Снова внес тему не в тот форум. Снова прошу прощения.

   
 
 автор: cheops   (01.12.2005 в 14:24)   письмо автору
 
   для: ck   (01.12.2005 в 11:42)
 

Дело в том, что функция readdir() возвращает и скрытые директории, а любая директория снабжается двумя скрытыми поддиректориями .. - ссылка на родительскую директорию и . - ссылка на текущую директорию. Поэтому их следует отсеять, чтобы не зациклить рекурсию.
<?php
while (($f readdir($op)) !== false

  
$t "$dir/".$f
  if (
is_dir($t) && $f != ".." && != "."
  { 
    echo 
"<a>".$f."</a><br>"
    
do_it($t); 
  } 
}
?>

   
 
 автор: ck   (01.12.2005 в 14:36)   письмо автору
 
   для: cheops   (01.12.2005 в 14:24)
 

Понято. Спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования