Дерево директории на PHP
Недавно меня попросили написать скрипт, который выводит дерево директории на PHP. Я решил, что это будет интересно многим, поэтому написал подобный скрипт, который сейчас продемонстрирую.
Вот весь код скрипта:
<?php
function showTree($folder, $space) {
/* Получаем полный список файлов и каталогов внутри $folder */
$files = scandir($folder);
foreach($files as $file) {
/* Отбрасываем текущий и родительский каталог */
if (($file == '.') || ($file == '..')) continue;
$f0 = $folder.'/'.$file; //Получаем полный путь к файлу
/* Если это директория */
if (is_dir($f0)) {
/* Выводим, делая заданный отступ, название директории */
echo $space.$file."<br />";
/* С помощью рекурсии выводим содержимое полученной директории */
showTree($f0, $space.' ');
}
/* Если это файл, то просто выводим название файла */
else echo $space.$file."<br />";
}
}
/* Запускаем функцию для текущего каталога */
showTree("./", "");
?>
Код тщательно прокомментирован, поэтому вопросов возникнуть не должно. Как видите, всё построено вокруг рекурсии, и каждый каталог рекурсивно обследуется. А когда полностью обследован (а также все его подкаталоги), то возвращаемся в цикл и двигаемся дальше. Такой процесс происходит абсолютно с каждым каталогом, который попадается на пути.
Я Вам предлагаю найти у себя на компьютере сайт, где много директорий, поддиректорий и файлов и испытать данный PHP-скрипт, построив дерево корневой директории.
-
- Михаил Русаков
Комментарии (18):
Классный скрипт, вот только почему-то скан доходит только до первой глубины вложенности каталогов, а подкаталаги уже не сканирует(
Ответить
Поменяйте строку if (is_dir($file)) на if (is_dir($f0)) и будет Вам счастье!
Ответить
Спасибо большое! Подправил.
Ответить
А может вы всё-таки напишите скрипт древовидных комментариев ? Или вы не хотите писать потому что есть статья?
Ответить
Нет, пока писать скрипт времени нет.
Ответить
Ясно, а в будушем напишите?
Ответить
Посмотрим.
Ответить
Мне тоже интересно узнать, как выводить древовидные комментарии, т.е. как у вас, при использовании кнопки/ссылки "Ответить" рядом с комментарием. С добавлением комментария - проблем никаких, как и с выводом; вот что я действительно не могу понять, как заставить комментарий "сместиться" в сторону, при помощи PHP...
Ответить
Это не при помощи PHP, а при помощи CSS. А PHP лишь генерирует соответствующий HTML-код, который ничего не смещает сам по себе.
Ответить
То есть, нужно заранее написать стиль для смещения, и шаблон, в который PHP будет загружать комментарий, и присваивать соответствующий стиль? Или же нужен всего один стиль, а при помощи PHP мы должны вставить шаблон комментария перед закрывающим тегом, чтобы получились древовидные комментарии? Я правильно вас понимаю? Если нет, тогда я в отчаянии... :)
Ответить
<ul> <li>Комментарий<ul><li>Ответ<ul><li>Ещё ответ</li></ul></li></ul></li></ul> - вот древовидные комментарии, и у каждого ul должен быть margin-left. Вот такую структуру надо генерировать на PHP, задача непростая, требуется рекурсия. Без хороших знаний точно не обойтись.
Ответить
Понятно. Спасибо.
Ответить
Здравствуй Михаил! У меня код: <ul> <li>%menu% </li> </ul> где <li>%menu% </li> представляет собой: <h1>%title%</h1><ul><li><a href = "%link%">%titlearticle%</a> </li></ul> Подскажи пожалуйста направление мысли, в части написания кода, и оптимального составления таблицы в базе. Я хочу написать скрипт, где будет генерироваться некоторое количество <li> внешнего уровня, а внутри будет также генерироваться <h1>общий для некоторого количества внутренних <li>, которые в свою очередь, тоже будут генерироваться. То есть по русски будет список с названиями разделов, и каждому разделу будет принадлежать несколько ссылок подразделов
Ответить
Всё стандартно в подкатегориях просто добавляете поле с указанием id родительской категории и так далее.
Ответить
Добрый день, Михаил. Спасибо за хороший скрипт. Одна только проблема. Файлы в каталоге выводятся не так как надо, не пойму, они или по дате выводятся или по типу? У меня выводятся бардаком, нельзя ли как-то их по полочкам разложить, что б из директории выводились сперва под-категории, а потом файлы, а то сейчас всё вперемешку.
Ответить
$files = scandir($folder, $sorting_order = SCANDIR_SORT_ASCENDING); вывод по алфавиту. sorting_order По умолчанию, сортировка производится в алфавитном порядке по возрастанию. Если необязательный параметр sorting_order установлен в значение SCANDIR_SORT_DESCENDING, сортировка производится в алфавитном порядке по убыванию. Если же он установлен в значение SCANDIR_SORT_NONE, то сортировка не производится.
Ответить
Поднаточил скрипт немного -добавил подсказку около названии директории, что это не файл, заменил тупые пробелы на тире, чтобы по их количеству виден был уровень вложенности. Код: <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title></title> </head> <body alink="#000088" bgcolor="#FFFFFF" link="#0000FF" text="#000000" vlink="#FF0000"> <?php error_reporting(E_ALL ^ E_NOTICE); ini_set('display_errors', 1); echo " <h1>Дерево директорий и файлов:</h1><br><br>"; function showTree($folder, $space) { // Получаем полный список файлов и каталогов внутри $folder $files = scandir($folder, $sorting_order = SCANDIR_SORT_ASCENDING); foreach($files as $file) { //Преобразуем спецсимволы в именах в штмл-сущности: $file = htmlspecialchars($file, ENT_NOQUOTES | ENT_SUBSTITUTE,'UTF-8'); // Отбрасываем текущий и родительский каталог if (($file == '.') || ($file == '..')) continue; $f0 = $folder.'/'.$file; //Получаем полный путь к файлу // Если это директория if (is_dir($f0)) { // Выводим, делая заданный отступ, название директории echo $space.$file." <b><font color=\"#cc0000\"><DIR></font></b><br>"; // С помощью рекурсии выводим содержимое полученной директории showTree($f0, $space.'-'); } // Если это файл, то просто выводим название файла else echo $space.$file."<br>"; } } // Запускаем функцию для текущего каталога showTree("./", ""); ?> </body> </html>
Ответить
Странно, почему все строки в комментах валятся в кашу ? Как форматировать комментарии?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.