Я пытаюсь добавить скрипт генерирования карты сайта в свое PHP-приложение, которое я использую для создания своего локально размещенного веб-сайта, и я немного застрял при разборе каталогов во вложенном дереве.Для начала, я не уверен, что рекурсивная или итеративная реализация была бы более полезной, учитывая, что я уже сгенерировал каталоги и файлы, которые я могу использовать для построения карты.
Конструктор длякласс Sitemap выглядит следующим образом:
public function __construct($base_dir = null) {
if($base_dir === null) {
$base_dir = Application::getPublicContentDir();
}
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($base_dir), RecursiveIteratorIterator::SELF_FIRST);
foreach($files as $file) {
$name = $file->getFilename();
if($name !== '..' && $name !== '.') {
$path = $file->getPathname();
$ext = '.' . $file->getExtension();
$path = substr($path, strlen($base_dir));
$path = str_ireplace($ext, null, $path);
$is_index = strrpos($path, '/index');
$is_menu = strrpos($path, '/menu');
$is_sitemap = strrpos($path, '/sitemap');
if($is_index === false && $is_menu === false && $is_sitemap === false) {
$this->site_tree[] = $path;
}
}
}
$this->site_tree = array_unique($this->site_tree);
}
По сути, он будет проходить по заданному каталогу (по умолчанию это каталог, установленный как каталог общего содержимого в Приложении) и выводить массив, содержащий пути к каждому узлу.в дереве каталогов удаляются расширения файлов и дубликаты.Пример вывода выглядит следующим образом:
/home
/miscellaneous
/miscellaneous/texy_test
/music
/music/samples
/about
/sitemap
/railways
/railways/signalling
/railways/signalling/menu
/railways/signalling/victoria
/railways/signalling/victoria/mckenzie_holland_1873_frames
/railways/signalling/victoria/double_wire_frames
/railways/signalling/uk
/railways/signalling/uk/midland_rotary_interlocking_block
/railways/signalling/uk/lms_speed_signalling
/railways/signalling/germany
/railways/signalling/germany/block_interlocking_principles
Я хочу превратить вывод во что-то похожее на это:
- "Home":[/home]
- "Miscellaneous":[/miscellaneous]
- "Texy test":[/miscellaneous/texy_test]
- "Music":[/music]
- "Samples":[/music/samples]
- "About":[/about]
- "Sitemap":[/sitemap]
- "Railways":[/railways]
- "Signalling":[/railways/signalling]
- "Victoria":[/railways/signalling/victoria]
- "McKenzie & Holland 1873 Patent Frames":[/railways/signalling/victoria/mckenzie_holland_1873_frames]
- "Double-Wire Frames":[/railways/signalling/victoria/double_wire_frames]
- "United Kingdom":[/railways/signalling/uk]
- "Midland Rotary Interlocking Block":[/railways/signalling/uk/midland_rotary_interlocking_block]
- "LMS Speed Signalling":[/railways/signalling/uk/lms_speed_signalling]
- "Germany":[/railways/signalling/germany]
- "Block and Interlocking Principles":/railways/signalling/germany/block_interlocking_principles]
Фактическая обработка текста для генерации каждого элемента списка проста;Я уже написал это, и я могу использовать его повторно, поскольку я часто заменяю одни и те же фразы, когда они встречаются в путях (т. Е. В сценарии с хлебными крошками "uk" → "United Kingdom").То, что я застрял, является отступом списка;Единственное решение, которое я могу придумать, - это разбить каждую строку на '/' и использовать счетчики массива, но это неуклюже.
В настоящее время я хочу вывести разметку в стиле Texy, потому что я использую Texy дляобрабатывать мои отдельные страницы;но, вероятно, было бы менее сложно вычислить вложенный список из HTML, если бы это можно было сделать так же просто, как разметку Texy.