Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] дерево по отступан / 7 сообщений из 7, страница 1 из 1
01.12.2012, 10:31
    #38060895
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
Привет. Нет ни ID, ни parent_id. Есть номера и отступы.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ABAC
   1_Компрессоры
      1_Поршневые ABAC
         1_Бензиновые компрессоры
            Компрессор EngineAIR B3800B/100 5HP (330л/мин_100л_10бар_4кВт_мобильный_бензин)
            Компрессор EngineAIR B3800B/11+11 5.5HP (330л/мин_11л+11л_10бар_4кВт_мобильный_бензин)
         2_Малошумные компрессоры
            Компрессор B2800/27 CM2 PLUS (254л/мин_27л_10бар_1.5кВт_220В_рапид) + катушка с шлангом 5м
            Компрессор B2800B/100 CM3 PLUS (320л/мин_100л_10бар_2.2кВт_220В_рапид) + катушка с шлангом 5м
      2_Поршневые MECAFER
      3_Поршневые IMPACT
   2_Аксессуары
      1_Разъемы
         Байонетное соединение для шланга (елочка) 8мм
         Вентиль с наружной резьбой 1/4

Как по такому построить дерево категорий и товаров?
...
Рейтинг: 0 / 0
01.12.2012, 12:39
    #38060968
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
Тырим данные с чужого сайта/документа? ;-)
...
Рейтинг: 0 / 0
01.12.2012, 12:50
    #38060977
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
vkle,

Интеграция
...
Рейтинг: 0 / 0
01.12.2012, 12:50
    #38060978
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
Bednii_Student,

Распарсить и засунуть в интер-магаз
...
Рейтинг: 0 / 0
01.12.2012, 13:45
    #38061006
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
Хороша интеграция! Исходные данные изначально в блокноте написаны, не иначе.
...
Рейтинг: 0 / 0
01.12.2012, 13:58
    #38061016
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
Вообще, решается довольно просто.
Читаем следующую строку
Смотрим в ней к-во табуляций или пробелов в начале и оцениваем "глубину" этой строки.
Если глубина больше чем у предыдущей - это подкатегория или товар.
Если меньше - это новая подкатегория родительского уровня.
Если такая же - ну тут и так понятно.
Как отличить товар от пустой подкатегории - фиг знает, мож по первым символам, а мож и нет.
...
Рейтинг: 0 / 0
01.12.2012, 18:25
    #38061145
Bednii_Student
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP] дерево по отступан
vkle,

Если интересно, то вот так.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
class node 
{
    // TEMPORARY
    public $depth = 0;

    public $value  = null;
    public $parent = null;
    public $children = array();

    public function __construct($value)
    {
        $this->value = $value;
    }

    /**
    * Разворачивает массив строк в дерево,
    * считая эту ноду корневой
    */
    public function expand($lines)
    {
        $this->parent = null;
        $this->value  = null;
        $this->depth  = -1;

        $this->_append($lines, 0, $this);
    }

    /**
    * Защищенный метод, связывающий массив строк в дерево
    */
    protected function _append($lines, $offset = 0, $prev = null)
    {
        if (isset($lines[$offset]))
        {
            $line = $lines[$offset];

            if ($result = preg_match('/^([\s]+)/ui', $line, $out))
            {
                $spaces_num =  mb_strlen($out[0]);
                $depth = round($spaces_num / 3);
            }
            else
            {
                $depth = 0;
            }

            $node = new node($lines[$offset]);
            $node->depth = $depth;
            $node->value = trim($line);

            if ($prev)
            {
                if ($prev->depth == $node->depth)
                {
                    $node->parent = $prev->parent;
                    $node->parent->children[] = $node;
                }
                else if($prev->depth < $node->depth)
                    {
                        $node->parent = $prev;
                        $prev->children[]= $node;
                    }
                    else // if($prev->depth > $node->depth)
                    {
                        $curr = $prev;
                        while ($curr && $curr->depth >= $node->depth)
                        {
                            $curr = $curr->parent;
                        }
                        $node->parent = $curr;
                        $curr->children[] = $node;

                        //$node->children[]= $prev;
                }
            }

            $this->_append($lines, ++$offset, $node);
            return $node;
        }
        return null;
    }

    /**
    * Выводит путь к продуктам и сами продукты
    * в виде двухмерного массива
    */
    public function show()
    {
        // Если нода не является категорией
        if ( ! $this->is_category())
        {
            $all = array();

            // Собираем всех родителей
            $curr = $this;
            while ($curr)
            {
                if ($curr->value !== null)
                {
                    $all[] = $curr->value;
                }
                $curr = $curr->parent;
            }
            // Возвращаем путь в виде массива строк
            return array(array_reverse($all));
        }

        $out = array();

        foreach ($this->children as $child)
        {
            $out = array_merge($out, $child->show());
        }
        return $out;
    }

    /**
    * Проверят, является ли эта нода категорией
    */
    public function is_category()
    {
        return preg_match('/^[0-9]_/ui', $this->value) ||
        ! $this->depth ||
        count($this->children);
    }
}

//-----------------------------------------------------------------------------
        $tree = new node(null);
        $tree->expand($this->lines);
        $info = $tree->show();
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] дерево по отступан / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]