Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Функция для вывода всех директорий и файлов внутри заданной директории

#1 Sasha_1988

Sasha_1988
  • Пользователь
  • 25 сообщений
  • Репутация: 1
0

Отправлено 14 Январь 2015 - 21:03

Добрый вечер, прошу помочь разобраться .

 

Ниже код функции для вывода всех файлов и директорий внутри директории, также когда внутри заданной директории находятся еще какие-либо вложенные директории, функция с помощью рекурсии вызывает саму себя и 

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

 

Однако функция неправильно работает, не понимаю почему

Ниже код.

<?
function direct ($dir,$tab){	
	$d=opendir($dir);
	while ($name= readdir($d)){
		if ($name=="." or $name=="..")
		continue;
		if (is_dir($name)){
		echo "<b>".$tab."[$name]</b><br>";
		$tab.= '-';
		direct($dir."/$name",$tab);
		}
		else{
		echo "$tab$name<br>";
		}	
	}
closedir($d);
}
direct(".","");
?>

 

 

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 15 Январь 2015 - 11:26

Однако функция неправильно работает, не понимаю почему

Функция работает не совсем корректно из-за вот этой вот строки кода:

$tab .= '-';

Получается, что переменная перезаписывается с новым значением, как только мы дойдем до каталога... правильно же не перезаписывать переменную, а приклеивать к ней разделитель, тогда значение переменной останется исходным, но склеенная строка попадет в рекурсивно вызванную функцию. Соответственно, проблемную строку из кода нужно убрать, а рекурсивный вызов заменить таким:

direct($dir . "/$name", $tab . '-');

И чтение каталога правильно производить несколько иначе, во избежание проблем с каталогами, имена которых можно преобразовать в FALSE (подробнее см. документацию к функции readdir). Итоговый код функции на всякий случай:

function direct ($dir,$tab){
	$d = opendir($dir);
	while ( false !== ($name = readdir($d)) ){
		if ($name == "." or $name == "..") continue;
		
		if ( is_dir($dir . '/' . $name) ){
			echo "<b>". $tab . "[$name]</b><br>";
			direct($dir . "/$name", $tab . '-');
		}else{
			echo "$tab$name<br>";
		}	
	}
closedir($d);
}
direct(".","");

  • 0


#3 Sasha_1988

Sasha_1988
    Topic Starter
  • Пользователь
  • 25 сообщений
  • Репутация: 1

Отправлено 15 Январь 2015 - 20:54

Большое спасибо!


  • 0

#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Январь 2015 - 10:45

Пожалуйста.


  • 0



Оформление форума – IPBSkins.ru