Model:我有一个像id:name:parentId这样的表。父 ID 引用 到标识。构建树的简单递归。
例如:
- 1:根:空
- 2:标题1:1
- 3:标题2:1
- 4:副标题1.1:2
在我的控制器中,我现在将调用数据库并传递数据 一直到视图。如果我这样做,那么我将有一个函数 在我的视野内。我不喜欢我的观点:)的功能。
另一种方法是以某种方式对其进行排序。但这真的会有所作为吗?
- 为此,我
- 必须使用帮助字段来了解我处于哪个级别。所以我可以迭代排序的数组。
- 或者另一种方法:多维数组。也许毫无意义,因为我不知道那棵树会有多深。
将不胜感激任何建议。提前谢谢。
编辑:IM 接收数据作为对象。
根据基于 MVC 框架的设计(胖模型、超薄控制器)的趋势,我建议使用您的模型来获取数据并将嵌套数据集(多维数组)传递给控制器/视图。层次结构有多深并不重要,它将是有限的。
由于这个问题有点宽泛,因此不清楚它是哪种数据,也不清楚您是总是一次需要整个数据还是只需要其中的某个相对块。无论哪种方式,我想你都想保留层次结构,所以如果你不习惯遍历嵌套数组,总是可以选择使用 (Std)Objects。
如果你看这里,你会看到一个嵌套的树(表)。单击To Array
按钮。您将看到如下所示的数组:
'0' ...
'item_id' ...
'parent_id' => "none"
'depth' => "0"
'left' => "1"
'right' => "22"
'1' ...
'item_id' => "1"
'parent_id' ...
'depth' => "1"
'left' => "2"
'right' => "7"
请注意此处解释的left
和right
通过这种方式,您还可以获得深度和树的一部分。
在模型中构建多维数组并将其传递给视图。
您可以使用指针创建多维数组而无需递归。
// collect tree
$res=$Conn->query('SELECT id, name, parentId FROM tree');
// if your root node has parent 0
$tree[0]->children=array();
// build into one array
// every node is found from its $tree[parentId]->children[id]
// and from $tree[id]
foreach($res as $row)
{
$tree[$row['id']]->data=$row;
if(!isset($tree[$row['id']]->children))
$tree[$row['id']]->children=array();
$tree[$row['parentId']]->children[$row['id']]=&$tree[$row['id']];
}