Создание иерархии из простых строк (PHP) - PullRequest
1 голос
/ 08 апреля 2011

У меня есть несколько строк в БД: x, y, z, x1, x2, x12, x22, x23, y1, y2, y3, z1, z2 (не воспринимайте их буквально).

Из этих строк и имея некоторые правила классификации (строки x1, x2 и x3 «принадлежат» строке x), я хочу построить какой-то вид ООП, включающий эти правила классификации.

x
 x1
  x12
 x2
  x22
  x23
y
 y1
 y2
 y3
z
 z1
 z2

По сути, я хочу сделать меню из простых строк, зная их отношение.

Мой вопрос: каков наилучший способ сохранить их отношение друг к другу, чтобы я мог точно определить их точное «местоположение» в этой иерархии? Есть ли шаблон дизайна, который подходит для этой проблемы? Я имею в виду сущностей, имеющих какое-либо свойство «глубина» или «тип».

Ответы [ 4 ]

1 голос
/ 08 апреля 2011

Вы можете хранить пункты меню в таблице, имеющей столбцы: id, title, parent_id

В PHP вы могли бы иметь объекты:

class MenuItem {
  $id = 0;
  $parent_id = 0;
  $title = ""; 
  $children = array();
}

Вы будете хранить детей в массиве, используя их идентификатор в качестве ключа:

function add_child($menu_item) {
  $this->children[$menu_item->id] = $menu_item;
}

При загрузке из БД вы создадите свое меню, вставив в него пункты меню. Просто добавьте функцию вставки в объект MenuItem:

function insert($menu_item) {
  if ($menu_item->parent_id==$this->id) {
    $this->add_child($menu_item);
    return true;
  }

  foreach ($children as $child) {
    if ($child->insert($menu_item))
      return true;
  }

  // return false if we could not insert it in any of our children
  return false;
}
0 голосов
/ 08 апреля 2011

вы можете упорядочить эти значения в таблице, как дерево вложенных множеств (http://www.edutech.ch/contribution/nstrees/index.php),, и тогда довольно легко найти всех потомков или родителя

0 голосов
/ 08 апреля 2011

Один из способов сделать это - добавить столбец parent_id в таблицу. Для каждой записи будет родительский элемент со значением 0 или основной идентификатор какой-либо другой записи. Если у вас есть это, вы можете написать рекурсивную функцию для анализа дерева.

0 голосов
/ 08 апреля 2011
0:(x,null)
1:(x1,0)
2:(x12,1)
3:(x2,0)
4:(x22,3)
5:(x23,3)
[...]

«5: (x23,3)» означает, что узел 5 является дочерним по отношению к узлу 3 и содержит «x23». «0: (x, null)» означает, что узел 0 является верхним узлом без родительского узла.

эта структура данных может моделироваться числовым массивом, который содержит массив из двух элементов.

Вы должны проанализировать это дерево рекурсивно.

...