LINUX.ORG.RU

Вопрос по PHP


0

0

Какие в PHP существуют способы представления деревьев? 

Нужно что-то типа такого:

root -- Линукс -- redhat
     |         |  |- седьмой
     |         |  |- восьмой
     |         |  |- девятый
     |         |- slacka
     |         |  |- десятая
     |         |  |- одиннадцатая
     |         |- gentoo
     |         |- debian
     |- BSD -- freebsd
     |       |  |- четвертая
     |       |  |- пятая
     |       |- openbsd
     |       |- netbsd
     |-  Wenda -- xp
                |- 98
                |- 2k

Думал, это можно представить многомерными массивами, но не допер как.

Знаю, что вопрос тупейший, наверняка. Помогите, пожалуйста.
anonymous

Ответ на: комментарий от RommeDeSerieux

Понятно, спасибо, а вот как хранить все это в базе данных, неясно... и как это считывать из базы в массив...

Сейчас я пока записал в базу что-то вроде этого:

+----+-----------------+------------+
| id | descr           | belongs_to |
+----+-----------------+------------+
|  1 | root            |          0 |
|  2 | Линукс          |          1 |
|  3 | redhat          |          2 |
|  4 | slacka          |          2 |
|  5 | десятая         |          4 |
|  6 | одиннадцатая    |          4 |
|  7 | gentoo          |          2 |
|  8 | debian          |          2 |
|  9 | BSD             |          1 |
| 10 | wenda           |          1 |
+----+-----------------+------------+

т.е. "slacka принадлежит к записи #2 - линукс", "десятая принадлежит к записи #4 - slacka", и т.п.

А вот записать это все в многомерный массив никак не могу. Уже больше восьми часов бьюсь. 
Получается жутко громоздко, и к тому же не работает :)

anonymous
()
Ответ на: комментарий от anonymous

> Сейчас я пока записал в базу что-то вроде этого:

Ну так правильно. Разве что, поле belongs_to каноничнее назвать parent_id или obj_obj_id.

> Получается жутко громоздко, и к тому же не работает :)

Объектами?

eugine_kosenko ★★★
()
Ответ на: комментарий от eugine_kosenko

Объект создать? Да всего-то и нужно, что вывести эти данные в комбобокс <select>, примерно как на схеме в первом посте.

И я не понимаю, что именно решит объект... Придется искать элемент массива, к которому подцепить новый?.. т.е. сколько строк в таблице - столько раз придется запускать ф-цию поиска... долго, наверное, выйдет...

anonymous
()

<?php

class Node {
  var parent = FALSE;
  var child = array();
}

?>

Типа так?

sanwashere ★★
()
Ответ на: комментарий от anonymous

> И я не понимаю, что именно решит объект...

Можно рекурсивно построить дерево. Проще, оно, конечно, не станет, но станет регулярнее.

> Да всего-то и нужно, что вывести эти данные в комбобокс <select>, примерно как на схеме в первом посте.

Хотя в такой постановке это в самом деле оверкил. Кажется, в contenido были аналогичные решения в виде модулей, но сейчас под рукой ничего не развернуто.

Факт, что для такой задачи и многомерные массивы не нужны. Ща попробую вспомнить набросок типичного решения для таких задач.

eugine_kosenko ★★★
()

Всем спасибо, вроде нашел то что нужно:

http://www.codenet.ru/webmast/php/tree.php

Только куча запросов к базе данных выйдет. Мне изначально такая идея в голову приходила, но я ее по этой причине отбросил, а оказывается, так и делают ))

anonymous
()
Ответ на: комментарий от anonymous

ишь как люди без рельсов и act_as_tree мучаются :(

anonymous
()
Ответ на: комментарий от anonymous

> Только куча запросов к базе данных выйдет

один запрос.

select id, parent_id, foo, bar from t_tree;

далее пробегаем по результату циклом и создаем двумерный массив вида:

$tree = [
  1 => [
      'name' => 'root',
      'child'  => [&$tree[2]],
  ],
  2 => [
      'name' => 'Линукс'
      'child'  => [&$tree[3], &$tree[4]],
  ],
  3 => [
      'name' => 'redhat',
      'child'  => [],
  ],
  4 => [
      'name' => 'slacka',
      'child'  => [&$tree[5], &$tree[6]],
  ],
    . . .
];

вот тебе структура, которую можно представить одновременно и как массив, и как дерево

friday ★★★
()
Ответ на: комментарий от friday

> и создаем двумерный массив

он, конечно, не совсем двумерный:-) но тем не менее, суть ясна

friday ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.