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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивный цикл, не получается собрать все имена файлов 
:(
    Опции темы
JoKeR.PNZ
Дата 18.9.2007, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема такая. У меня есть директория, именуется как "class". В этой директории довольно большая вложенность, то есть много еще поддиректорий, в которых также есть еще директории (глубина 4-5).

То есть как-то так выглядит дерево каталога "class":

class
 - board
   -- group
      --- dir_3_lvl
         ---- dir_4_lvl
   -- test
 - content
 - news
 ...
 - report

Задача такая: рекурсивно пройтись по каталогу "class" и собрать (в массив собираю) имена всех файлов, имеющих расширение ".class.php".

Подскажите, что неправильно делаю в своем коде:

Код

// путь к папке с классами
$class_dir = "class";

// массив, содержащий имена файлов и директорий папки class
$file_arr = scandir($class_dir);

// массив для сохранения всех имен модулей
$module_arr = array();
$row_arr = 0;

/* проходим циклом по массиву 
   и сохраняем имена всех классов
   в новый отдельный массив 
*/
while(current($file_arr))
{            
    
    // отбрасываем родительский и дочернии каталоги
    if(current($file_arr) == "." || current($file_arr) == "..")
    {
        // ничего не делаем
    }
    
    // если текущий элемент массива - директория
    if(is_dir($class_dir."/".current($file_arr)))
    {                
        // ищем файлы в этом каталоге
        $dir_level_2 = $class_dir."/".current($file_arr);        
        $level_2_arr = scandir($dir_level_2);
        
        // проходим массивом по каталогу 2 уровня
        while(current($level_2_arr))
        {            
            
            // отбрасываем родительский и дочернии каталоги
            if(current($level_2_arr) == "." || current($level_2_arr) == "..")
            {
                // ничего не делаем
            }            
            
            if(is_dir($dir_level_2."/".current($level_2_arr)))
            {
                $dir_level_3 = $class_dir."/".current($file_arr)."/".current($level_2_arr);
                $level_3_arr = scandir($dir_level_3);
                
                // проходим массивом по каталогу 3 уровня
                while(current($level_3_arr))
                {
                    
                    // отбрасываем родительский и дочернии каталоги
                    if(current($level_3_arr) == "." || current($level_3_arr) == "..")
                    {
                        // ничего не делаем
                    }                    
                    
                    if(is_dir($dir_level_3."/".current($level_3_arr)))
                    {
                        $dir_level_4 = $class_dir."/".current($file_arr)."/".current($level_2_arr)."/".current($level_3_arr);
                        $level_4_arr = scandir($dir_level_4);
                        
                        // проходим массивом по каталогу 4 уровня
                        while(current($level_4_arr))
                        {                            
                            
                            // отбрасываем родительский и дочернии каталоги
                            if(current($level_4_arr) == "." || current($level_4_arr) == "..")
                            {
                                // ничего не делаем
                            }                            
                            
                            // определяем, класс ли это
                            if(eregi(".class.php",current($level_4_arr)))
                            {
                                $double_count = 0;
                                // проверяем, нет ли в массиве такого класса
                                for($i=0; $i < $row_arr; $i++)
                                {
                                    if(current($level_4_arr) == $module_arr[$row_arr])
                                    {
                                        $double_count++;
                                    }
                                }
                                if($double_count == 0)
                                {
                                    // сохраняем имя в новом массиве
                                    $module_arr[$row_arr] = current($level_4_arr);
                                    $row_arr++;
                                }                                
                            }                            
                            next($level_4_arr);
                        }
                    }
                    else
                    {
                        // определяем, класс ли это
                        if(eregi(".class.php",current($level_3_arr)))
                        {
                            $double_count = 0;
                            // проверяем, нет ли в массиве такого класса
                            for($i=0; $i < $row_arr; $i++)
                            {
                                if(current($level_3_arr) == $module_arr[$row_arr])
                                {
                                    $double_count++;
                                }
                            }
                            if($double_count == 0)
                            {
                                // сохраняем имя в новом массиве
                                $module_arr[$row_arr] = current($level_3_arr);
                                $row_arr++;
                            }                            
                        }                                        
                    }
                    next($level_3_arr);
                }
            }
            else
            {
                // определяем, класс ли это
                if(eregi(".class.php",current($level_2_arr)))
                {
                    $double_count = 0;
                    // проверяем, нет ли в массиве такого класса
                    for($i=0; $i < $row_arr; $i++)
                    {
                        if(current($level_2_arr) == $module_arr[$row_arr])
                        {
                            $double_count++;
                        }
                    }
                    // если дублей нет - сохраняем имя в массив
                    if($double_count == 0)
                    {
                        // сохраняем имя в новом массиве
                        $module_arr[$row_arr] = current($level_2_arr);
                        $row_arr++;
                    }                    
                }                
            }
            next($level_2_arr);
        }
    }
    else
    {
        // определяем, класс ли это
        if(eregi(".class.php",current($file_arr)))
        {
            $double_count = 0;
            // проверяем, нет ли в массиве такого класса
            for($i=0; $i < $row_arr; $i++)            
            {
                if(current($file_arr) == $module_arr[$row_arr])
                {
                    $double_count++;
                }
            }
            // если дублей нет - сохраняем имя в массив
            if($double_count == 0)
            {                
                $module_arr[$row_arr] = current($file_arr);
                $row_arr++;
            }            
        }                
    }
    next($file_arr);
}
// Чистим массив от дублей
$result_arr = array_unique($module_arr);
$arr_counter = count($result_arr);

for ($i=0; $i < $arr_counter; $i++)
{
    echo $module_arr[$i];
    echo "<br>";
}
echo $arr_counter;
?>


Добавлено @ 06:04
В принципе, реализовал, как это описано в: http://ru2.php.net/manual/en/function.Dire...r-construct.php. Но все-таки, что в моем коде не так?

Это сообщение отредактировал(а) JoKeR.PNZ - 18.9.2007, 06:06
PM MAIL   Вверх
drpain
Дата 28.9.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не стал с твоим кодом расбираться... я это делал так, пишу заново


Код


$str = "./Mydir/"; // Ясен красен, задаешь деррикторию, обезательно должен быть закрывающий слеш "/", без него никак
$arr = array(); //Создаешь пустой массив

scanfolder($str, $arr) ;  //После этого вызова у тебя в массиве $arr должна быть вся твоя папка с инфой о ней, делал под РНР 5, на 4 не тестил, так что не факт что будет работать

print_r($arr);

function scanfolder($dir, &$arrayway) 
{
    $i=0;
    $lowwerdir = scandir($dir);
    foreach($lowwerdir as $folder)
    {
        if($folder != "." && $folder != "..")
        {
            $allpath = $dir.$folder;
            if(is_dir($allpath))
            {
                $allpath .= "/";
                $arrayway[$i]["Name"] = $folder;
                $arrayway[$i]["FullPath"] = $allpath;
                $arrayway[$i]["Dir"] = true;
                $stat = stat($allpath);
                $arrayway[$i]["Mode"] = $stat["mode"];
                $arrayway[$i]["LastMod"] = $stat["mtime"];
                $arrayway[$i]["Size"] = $stat["size"];

                scanfolder($allpath, $arrayway[$i]["NextDir"]);
            }
            else 
            if(is_file($allpath))
            {
                $arrayway[$i]["Name"] = $folder;
                $arrayway[$i]["FullPath"] = $allpath;
                $arrayway[$i]["Dir"] = false;
                $stat = stat($allpath);
                $arrayway[$i]["Mode"] = $stat["mode"];
                $arrayway[$i]["LastMod"] = $stat["mtime"];
                $arrayway[$i]["Size"] = $stat["size"];
            }
            
            $i++;
        }
    }
}



Сорри, что без комментов, не охота писать, да там и интуитивно понятно что происходит

Ах, да, там тебе расширение только надо smile я переборщил, ну проверку где надо там поставить не проблема

Это сообщение отредактировал(а) drpain - 28.9.2007, 09:57
PM MAIL   Вверх
sTa1kEr
Дата 28.9.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

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



JoKeR.PNZ, если все-таки глубина вложений ограничена, то можно воспользоватся функцией glob()
Код

$depth = 5;
$level = array();

for ($i = 0; $i < $depth + 1; $i++)
{
   $level[$i] = implode("*", array_fill(0, $i + 1, "/"));
}
$pattern = "{".implode(",", $level)."}*.class.php";
$classes = glob("/path/to/classes".$pattern, GLOB_BRACE);

PM MAIL   Вверх
JoKeR.PNZ
Дата 28.9.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



drpain, спасибо но громоздко очень..

sTa1kEr, элегантно! Проверю щас..
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.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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