Сортировка и сохранение массива, возвращаемого методом, в качестве родительских и дочерних данных для отображения вложенных / многоуровневых комментариев в codeigniter 2.0 - PullRequest
0 голосов
/ 27 мая 2011

Привет, ребята, я пытаюсь выучить codeigniter, но еще раз я ЗАСТУПАЮ и я ищу помощи (как обычно: P)

What I need to do?
-> Мне нужно получить данныесвязанные со статьей из базы данных, а также с другими вещами, такими как теги для статьи и все comments.Я думаю о сохранении одноуровневых вложенных комментариев к статье.

Что ж, я закончил с частью тега [ссылка на ответ, которая помогла мне с тем же: Возврат и использование многомерного массивазаписи из базы данных в CodeIgniter 2.0 ], но comment part сводит меня с ума.
Ну, для начала вот моя таблица комментариев

Comments
+---------------+-------------+
| Field         | Type        |
+---------------+-------------+
| commentId     | int(10)     |
| PostId        | int(10)     |
| author        | varchar(30) |
| email         | varchar(30) |
| url           | varchar(50) |
| date          | datetime    |
| comment       | text        |
| parent        | int(10)     | 
+---------------+-------------+

Я использую родительское поле, чтобы сохранитьдорожка родителя для вложенного дочернего комментария.По умолчанию значение равно 0, что означает его родитель.Дочерний комментарий будет содержать комментарий родительского комментария

    public function getPost($postName = NULL , $year = NULL, $month = NULL ){
        if($postName != NULL && $year != NULL && $month != NULL){
            //single post
            $this->load->model('comment_model');
            $this->db->where('postName',$postName);
            $this->db->where('year(date)',$year);
            $this->db->where('month(date)',$month);
            $q = $this->db->get('mstack_Post'); 
            if($q->num_rows()>0){
                $post = $q->result();
                foreach ($post as &$p) {
                    $p->tags = $this->getAllTags($p->postId);   

                      /* getting the comments */
                    $com = $this->comment_model->getComments($p->postId); 

                    /*echo count($com).' is the total count'; output= 4 */
                    foreach ($com as &$c) {
                                      /* trying to filter the comment. but all I get is 1 comment as the output*/
                        if($c->parent==0){
                            $p->comments->parentComment = $c;
                        }elseif($c->commentId==$c->parent){
                            $p->comments->childComment = $c;
                        }
                    }
                }
                return $post;
            }else{
                return array();
            }
        }
    }

Любая помощь обязательно будет оценена.Если у вас есть другая техника / идея для отображения многоуровневых комментариев, дайте мне знать.:)

1 Ответ

1 голос
/ 28 мая 2011

Вот решение, которое может оказаться полезным:

Сначала вам понадобится 2 вспомогательных рекурсивных функции:

// Building comments.
function buildComments($list, $parent = 0)
{
    // Creating result array.
    $result = array();

    //looping...
    foreach ($list as $item)
    {
        //iteration starts with 0 as default.
        if ($item->parent == $parent)
        {
            // add to the result
            $result[$item->commentId] = array(
                'author' => $item->author,
                // ... other definitions
                'child' => buildComments($list, $item->commentId) //execute this function for child.
            );
        }
    }
    return $result;
}

function printComments($arg, $depth = 1)
{
    foreach ($arg as $item)
    {
        // Printing comment...
        echo str_repeat('&nbsp; ', $depth) . $item['author'] . "<br />\r\n";
        // extra echoes...

        // if it has a child comment...
        if (count($item['child'] > 0))
        {
            printComments($item['child'], $depth + 1);
        }
    }
}

Небольшое объяснение:

Функция buildComments() будет начинаться со строк, в которых родители имеют 0. Затем она будет выполняться сама для ребенка. если ребенок как ребенок, он добавит его. В итоге результат будет такой:

$result = array(
    1 => array(
        'author' => 'John',
        'child' => array(
            8 => array(
                'author' => 'Jane',
                'child' => array(
                    3 => array(
                        'author' => 'Jamie',
                        'child => array()
                    )
                )
            ),
            6 => array(
                'author' => 'Jackie',
                'child => array()
            ),
            9 => array(
                'author' => 'Harry',
                'child => array()
            )

        )
    ),
    4 => array(
        'author' => 'Jack',
        'child' => array()
    ),
    10 => array(
        'author' => 'Clark',
        'child' => array(
            11 => array(
                'author => 'Lois',
                'child' => array()
            )
        )
    ),
    12 => array(
        'author' => 'Luthor',
        'child' => array()
    )
);

В функции printComments() мы печатаем результаты рекурсивно. для каждого ребенка функция повторяется. Вы получите такой результат:

  John
    Jane
      Jamie
    Jackie
    Harry
  Jack
  Clark
    Lois
  Luthor

Для получения дополнительной информации о рекурсивных функциях, посмотрите этот ответ

* 1021 USAGE *

$this->db->where('postName',$postName);
$this->db->where('year(date)',$year);
$this->db->where('month(date)',$month);
$this->db->order_by('parent', 'asc');
$query = $this->db->get('comments');

$comments = buildComments($query->result());

printComments($comments);

это так просто ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...