PHP:控制器和视图/在哪里放置递归方法



Model:我有一个像id:name:parentId这样的表。父 ID 引用 到标识。构建树的简单递归。

例如:

  1. 1:根:空
  2. 2:标题1:1
  3. 3:标题2:1
  4. 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"

请注意此处解释的leftright

通过这种方式,您还可以获得深度和树的一部分。

在模型中构建多维数组并将其传递给视图。

您可以使用指针创建多维数组而无需递归。

// 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']];
}

最新更新