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

Форум PHP

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

 

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

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

тема: Счётчик в рекурсии 1.1.1
 
 автор: Maxam   (02.05.2011 в 23:29)   письмо автору
 
 

Как сделать счётчик для рекурсивной функции?

Т.е. чтобы не просто выводил папки, а рядом ставил номера:
1
 1.1
 1.2
2
3
 3.1
 3.2
 3.3
 3.4
  3.4.1
  3.4.2


Спасибо.

  Ответить  
 
 автор: cheops   (02.05.2011 в 23:31)   письмо автору
 
   для: Maxam   (02.05.2011 в 23:29)
 

Можно объявить счетчики глобальными при помощи ключевого слова global.

  Ответить  
 
 автор: Maxam   (03.05.2011 в 03:21)   письмо автору
 
   для: cheops   (02.05.2011 в 23:31)
 

Я делал, но получилась нереально сложная и непонятная конструкция в коде и неверный результат:
1
1.1
1.1.1
1.2.2
1.3.3
1.4.4
1.5.5
1.6.6
2.2
2.1.1
2.2.2
Как видите не совсем то.

  Ответить  
 
 автор: cheops   (03.05.2011 в 10:30)   письмо автору
 
   для: Maxam   (03.05.2011 в 03:21)
 

Схему рекурсивной функции приведите, если не сложно.

  Ответить  
 
 автор: Maxam   (04.05.2011 в 00:41)   письмо автору
 
   для: cheops   (03.05.2011 в 10:30)
 

<?php
function recurs_dir($path)
{
static 
$depth 0;

$dir opendir($path);
while((
$file readdir($dir)) !== FALSE)
{
if(
$file == "." || $file == "..") continue;
echo 
str_repeat("-"$depth)." ".$file."<br>";

if(
is_dir($path."/".$file))
{
$depth++;
recurs_dir($path."/".$file);
$depth--;
}
}
closedir($dir);
}
recurs_dir(".");
?>

  Ответить  
 
 автор: cheops   (04.05.2011 в 10:57)   письмо автору
 
   для: Maxam   (02.05.2011 в 23:29)
 

Давайте разобъем задачу на части, выделив функцию увеличения счетчика и создания нового уровня вложения. Тогда код для автоматической нумерации может выглядеть следующим образом.
<?php
  
// Рекурсивный обход каталогов
  
function recurs_dir($path$depth ""
  { 
    
// Устанавливаем новый уровень нумерации
    
$depth depth_new($depth);
    
$dir opendir($path); 
    while((
$file readdir($dir)) !== FALSE
    { 
      if(
$file == "." || $file == "..") continue; 

      
// Увеличиваем глубину нумерации
      
$depth depth_increase($depth);
      echo 
"$depth $file<br />"

      if(
is_dir($path."/".$file)) 
      { 
        
// Рекурсивный вызов
        
recurs_dir($path."/".$file$depth); 
      } 
    } 
    
closedir($dir); 
  } 
  
// Новый уровень нумерации
  
function depth_new($depth)
  {
    if(!empty(
$depth))
    {
      
$arr explode("."$depth);
    }
    
$arr[] = "0";
    
$depth implode("."$arr);
    return 
$depth;
  }
  
// Увеличиваем глубину нумерации
  
function depth_increase($depth)
  {
    if(!empty(
$depth))
    {
      
$arr explode("."$depth);
    }
    else
    {
      
$arr[] = 0;
    }
    
// Увеличиваем последнее значение
    
$arr[count($arr) - 1]++;
    
$depth implode("."$arr);
    return 
$depth;
  }
  
// Вызов функции: точка входа программы
  
recurs_dir("."); 
?>

  Ответить  
 
 автор: Maxam   (04.05.2011 в 11:36)   письмо автору
 
   для: cheops   (04.05.2011 в 10:57)
 

О боже. Спасибо большое, буду сидеть и разбираться... дня 2 )

  Ответить  
Rambler's Top100
вверх

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