我需要一个节点作为Array中的节点和叶子,具有未定义的深度

时间:2014-04-02 19:06:38

标签: php

我正在制作评论系统,其中一个人可以回复另一个评论,使其显示在评论评论下方。我有一堆父/子对,为此我使用递归将其转换为树结构:

private function _create_tree_from_comments($comment_id, $entry_id) {
    $node_set = array();
    $children = $this->comment_model->get_children($comment_id, $entry_id);

    // check if we're a leaf
    if($children->num_rows() < 1) {
        return $comment_id;
    }


    foreach($children->result() as $child) {
        $node_set[$child->child] = $this->_create_tree_from_comments($child->child, $entry_id);
    }

    return $node_set;
}

现在这一切都很好,但问题是我需要保存有关中间节点的信息。目前我能做的就是在叶子的另一个数组中保存我需要的任何信息,因为中间节点有责任保存关于他们孩子的信息。

所以我的问题是:如何在不破坏父项及其子项之间的关系的情况下保存有关中间节点的信息。

该函数的一些示例输出:

Array 
(
     [5] => 5
     [2] => 2
     [1] => Array
         (
               [4] => Array
                   (
                       [6] => 6
                   )

               [3] => 3
         )

)    

1 个答案:

答案 0 :(得分:2)

树中的每个节点都可以是一个数组:

Array (
     ['comment_id'] => 7
     ['children'] => Array (...)
     ['whatever_else'] => 'foo'
)

因此,您的函数 - 而不是返回注释ID或数组 - 将始终返回一个数组,其中可能包含注释ID,子项或空数组(如果没有子项),以及您希望存储的任何其他内容

private function _create_tree_from_comments($comment_id, $entry_id) {
    $node_set = array();

    $children = $this->comment_model->get_children($comment_id, $entry_id);

    // check if we're a leaf
    if($children->num_rows() < 1) {
        $node_set['comment_id'] = $comment_id;
    }

    $node_set['children'] = array();
    foreach($children->result() as $child) {
        $node_set['children'][] = $this->_create_tree_from_comments($child->child, $entry_id);
    }

    $node_set['whatever_else'] = 'foo';

    return $node_set;
}