Рекурсивный обход всех директорий

McOuni

Guest
Корявый рекурсивный обход всех директорий

Нужно сделать рекурсивный обход всех директорий содержащихся начиная с заданной ($dir), чтобы на выходе получить нечто подобное:

$opt_array[0] = "directory1";
$opt_array[1] = "directory2";
$opt_array[2] = "directory2 / subdirectory01";
$opt_array[3] = "directory2 / subdirectory01 / subdirectory02";
$opt_array[4] = "directory3";
$opt_array[5] = "directory3 / subdirectory01";
$opt_array[6] = "directory3 / subdirectory01 / subdirectory02 / subdirectory03";
и так далее

Вот как это сделал я:

PHP:
function folders($dir)
{
        if ($handle = opendir($dir))
        {
                $r = 0;

                while (false !== ($dir2 = readdir($handle)))
                {
                        if ($dir2 != "." AND $dir2 != "..")
                        {
                                if (is_dir($dir.$dir2))
                                {
                                        $opt_array[$r] = $dir2;
                                        $bet = folders($dir.$dir2 . "/");
                                        foreach ($bet as $y)
                                        {
                                                $r++;
                                                $opt_array[$r] = $dir2 .'/'. $y;
                                        }
                                }
                        }
                        $r++;
                }
                closedir($handle);

        return $opt_array;
}
Но код мягко говоря уродлив по своему строению и на выходе выводит кривой массив с пропущенными ключами, хотя и содержащий все элементы.
Как мне упростить эту функцию. А то кажись я чегот намудрил
 

su1d

Старожил PHPClubа
=)

в PHP5 можно сделать так:
PHP:
class DirectoryLister extends FilterIterator 
{
	function accept() 
	{
		return $this->isDir();
	}
}

foreach(
	new DirectoryLister(
		new RecursiveIteratorIterator(
			new RecursiveDirectoryIterator('./'),
			RIT_SELF_FIRST
		)
	) as $dir) 
{
	echo $dir->getPathname();
	echo "\n";
}
 

McOuni

Guest
Только все в манаул да в манаул. Был я там ужо, ничего интересного, поэтому и задал вопрос на форуме.

2 su1d: Сенк за пример, но PHP5 вряд ли будет доступен мне на хостинге в ближайшее время.

Плз, ну а что можно изменить конкретно в моем примере под PHP4 :confused:
 
Сверху