powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] дерево по отступан
7 сообщений из 7, страница 1 из 1
[PHP] дерево по отступан
    #38060895
Bednii_Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Нет ни 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
[PHP] дерево по отступан
    #38060968
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тырим данные с чужого сайта/документа? ;-)
...
Рейтинг: 0 / 0
[PHP] дерево по отступан
    #38060977
Bednii_Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,

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

Распарсить и засунуть в интер-магаз
...
Рейтинг: 0 / 0
[PHP] дерево по отступан
    #38061006
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороша интеграция! Исходные данные изначально в блокноте написаны, не иначе.
...
Рейтинг: 0 / 0
[PHP] дерево по отступан
    #38061016
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, решается довольно просто.
Читаем следующую строку
Смотрим в ней к-во табуляций или пробелов в начале и оцениваем "глубину" этой строки.
Если глубина больше чем у предыдущей - это подкатегория или товар.
Если меньше - это новая подкатегория родительского уровня.
Если такая же - ну тут и так понятно.
Как отличить товар от пустой подкатегории - фиг знает, мож по первым символам, а мож и нет.
...
Рейтинг: 0 / 0
[PHP] дерево по отступан
    #38061145
Bednii_Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] дерево по отступан
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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