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

Сервис обмена электронных валют


Дерево каталогов из файла

#1 gaaarfild

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

Отправлено 18 Ноябрь 2010 - 03:47

Появилась необходимость отпарсить файл и из него составить дерево каталогов, которое будет передаваться плагину для jquery типа treeview.
Как это можно сделать?
Вот файл.Прикрепленный файл  output.txt   52,99К   Количество загрузок: 85

Заранее спасибо.

 

 

  • 0

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Ноябрь 2010 - 10:53

gaaarfild, в каком формате у тебя должны уходить данные в treeview и все ли тебе строчки нужны из файла? Задача не сложная, Получить имя на конце и сосчитать количество слешей, чтобы определить уровень вложенности, я так понимаю. Затем, скорее всего строится XML или что?
  • 0

#3 gaaarfild

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

Отправлено 18 Ноябрь 2010 - 19:35

Возможно сразу JSON.
Хотя, может и XML. Я, честно говоря, не выбрал еще плагин, так что можно любой, который удобнее, я думаю.
  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Ноябрь 2010 - 22:53

gaaarfild, ты так и не написал, что нужно получить при парсинге...
  • 0

#5 gaaarfild

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

Отправлено 19 Ноябрь 2010 - 16:48

Дерево каталогов. =)
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 19 Ноябрь 2010 - 23:31

gaaarfild, ппц, в какой форме, ведь потом же скрипт это должен будет обработать.
Можно сделать примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<treeview>
<nodes>
<node href="[ссылка]" text="ссылка 1">
<node href="[ссылка]" text="ссылка 1_1" />
<node href="[ссылка]" text="ссылка 1_2" />
</node>
<node href="[ссылка]" text="ссылка 2">
<node href="[ссылка]" text="ссылка 2_1">
<node href="[ссылка]" text="ссылка 2_1_1" />
<node href="[ссылка]" text="ссылка 2_1_2" />
<node href="[ссылка]" text="ссылка 2_1_3">
</node>
<node href="[ссылка]" text="ссылка 2_2" />
</node>
<node>
</nodes>
</treeview>

Но ведь ты за основу, как я понял, хочешь взять уже готовый скрипт вывода дерева каталогов... Поэтому и спрашиваю, какой формат данных он имеет. В какой форме их записывать. Это нужно чтобы распарсить и создать нужный формат.
  • 0

#7 gaaarfild

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

Отправлено 20 Ноябрь 2010 - 04:22

<root>
<item id="xml_1">
<content><name><![CDATA[Root node 1]]></name></content>
<item id="xml_2">
<content><name><![CDATA[Child node 1]]></name></content>
</item>
</item>
</root>


Вот такого типа.
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 20 Ноябрь 2010 - 17:16

gaaarfild, а где ссылка каждого элемента?
  • 0

#9 gaaarfild

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

Отправлено 21 Ноябрь 2010 - 19:56

А ссылка не нужна.
Нужно только такую структуру.
  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 25 Ноябрь 2010 - 19:55

gaaarfild, id-шники немного сделал другими, но суть остается та же (если не нужно, можно убрать все \r\n и \t, сделал их для нормального просмотра в исходном коде):
<?php

// функция-обертка создания дерева
function createTree($paths)
{
$tree = array(); // массив (дерево)
// обрабатываем по отдельности каждый путь
foreach($paths as $path)
recursiveCreateTree($tree, $path); // рекурсивно создаём дерево
return $tree; // возвращаем дерево
}

// функция рекурсии создания дерева
function recursiveCreateTree(&$parent, $path, $level = 0)
{
if(!isset($parent[$path[$level]]))
{
$parent[$path[$level]]['name'] = $path[$level];
$parent[$path[$level]]['nodes'] = array();
}

if(isset($path[$level+1]))
recursiveCreateTree($parent[$path[$level]]['nodes'], $path, $level+1);
}

// функция, создающая из дерева XML
function createXML($tree)
{
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
$xml .= "<root>";
$xml .= recursiveCreateXML($tree);
$xml .= "</root>";
return $xml;
}

// функция рекурсии, дерево -> XML (создание <item>...</item>)
function recursiveCreateXML($parent, $level=1, $str_id = "xml")
{
$count = 1;
$recursiveXML = "";
foreach($parent as $item)
{
$recursiveXML .= "\r\n". str_repeat("\t", $level) ."<item id=\"{$str_id}{$count}\">";
$recursiveXML .= "\r\n". str_repeat("\t", $level+1) ."<content><name>{$item['name']}</name></content>";
if( count($item['nodes']) )
$recursiveXML .= recursiveCreateXML($item['nodes'], $level+1, $str_id.$count."_");
$recursiveXML .= "\r\n". str_repeat("\t", $level) ."</item>";
$count++;
}
return $recursiveXML;
}

$paths = array(); // массив для занесения URL в формек строк "/catalog1/catalog2/catalog3"
$tmp = array(); // двумерный массив для занесения URL в форме "один_URL => ('catalog1', 'catalog2', 'catalog3')"
$tree = array(); // многомерный массив для занесения дерева (это наше дерево)

$paths = file("paths.txt"); // считываем URL'ы
$paths = str_replace(array("\r\n", "\n"), "", $paths); // очищаем все URL'ы от пробельных символов и символов переноса
$paths = array_unique($paths); // оставляем только уникальные URL'ы

// обрабатываем в цикле URL'ы
foreach($paths as $key => $path)
{
$tmp[$key] = explode("/", $path);
if( $tmp[$key][0] == "" )
array_shift($tmp[$key]); // удаляем первый элемент, если он пустой
}

$tree = createTree($tmp); // создаём дерево каталогов
echo createXML($tree); // создаем из дерева каталогов XML-документ

?>

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


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