从简单字符串创建层次结构(PHP)

时间:2011-04-08 11:44:22

标签: php design-patterns hierarchy classification

我在DB中有一些字符串:x,y,z,x1,x2,x12,x22,x23,y1,y2,y3,z1,z2(不要按字面意思理解)。

从这些字符串开始,并且有一些分类规则(字符串x1,x2和x3“属于字符串x”),我想构建某种包含这些分类规则的OOP-ish。

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

基本上,我想从简单的字符串中创建一个菜单,知道它们的关系。

我的问题是:将相互关系存储在一起的最佳方法是什么,以便我可以在这个层次结构中指出他们的确切“位置”?是否有适合此问题的设计模式?我虽然实体有一些属性“深度”或“类型”。

4 个答案:

答案 0 :(得分:1)

您可以将菜单项存储在包含以下列的表中:id, title, parent_id

在PHP中,您可以拥有对象:

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

您将使用ID作为键将子项存储在数组中:

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;
}

答案 1 :(得分:0)

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是没有父节点的顶级节点。

这个数据结构可以通过一个包含带有两个元素的数组的数值数组来建模。

你必须递归地解析那棵树。

答案 2 :(得分:0)

执行此操作的一种方法是在表格中添加parent_id列。对于每条记录,将有一个值为0的父级或一些其他记录的主要ID。一旦你有了这个,你可以编写一个递归函数来解析树。

答案 3 :(得分:0)

你可以在像嵌套集树(http://www.edutech.ch/contribution/nstrees/index.php)这样的表中组织这些值,然后很容易找到所有孩子或父母< / p>