用于评论和回复 PHP 应用程序的递归函数

Nic*_*Law 5 php mysql recursion

我很难概念化一个递归函数,用于将回复附加到评论、回复回复、回复回复等。

这是我的评论表:

在此处输入图片说明

应该渲染时是这个样子:

在此处输入图片说明

就目前而言,我可以呈现与 article_id 关联的每个评论(NOT NULL当然不包括那些评论):

$comments = $commentClass->fetch_article_comments($article_id);

foreach($comments as $comment) {

        $comment_id = $comment['comment_id'];   
        $member_id = $comment['member_id'];
        $comment_text = $comment['comment_text'];
        $comment_timestamp = timeAgo($comment['comment_timestamp']);  //get time ago

        //render comment using above variables
    }
Run Code Online (Sandbox Code Playgroud)

现在我假设我需要在上述foreach语句的末尾添加一个递归函数,但是我还没有想出任何远程成功的方法来附加评论回复和对每个回复的回复。

任何人都可以帮助我实现这一目标,或者为我指明正确的方向。我对递归函数并不完全熟悉。我已经对互联网和 stackoverflow 进行了一些扫描,寻找有帮助的东西,但还没有找到任何有用的东西。

我确实遇到过这篇推荐使用分层数据库系统的帖子,但我想我更愿意为此使用 php 递归函数。

谢谢。


编辑


通过使用以下答案,我只返回结果第一个评论,然后无限期地迭代并显示该评论。我想不通为什么?

我的PHP:

function display_comments($article_id, $parent_id=0, $level=0) {
    global $comment;
    global $member;
    global $signed_in;
    global $username;

    $comments = $comment->fetch_article_comments($article_id, $parent_id);

    foreach($comments as $data) {
        $comment_id = $data['comment_id'];   
        $c_member_id = $data['member_id'];
        $comment_text = $data['comment_text'];
        $comment_timestamp = timeAgo($data['comment_timestamp']);  //get time ago

        $member_data = $member->fetch_member_data($c_member_id);
        $c_member_username = $member_data['member_username'];
        $c_member_avatar = $member_data['member_avatar'];

                //render HTML here

                $parent = $data['comment_parent'];
                display_comments($article_id, $parent, $level+1);

    }//end foreach

}//end display_comments()
Run Code Online (Sandbox Code Playgroud)

和我的 PDO 查询:

public function fetch_article_comments($article_id, $parent_id) { //$page = (int)(!isset($_GET['page'])) ? 0 : $_GET['page'];

    if ($parent_id > 0) {
        $parent_id = "= $parent_id";
    } else {
        $parent_id = "IS NULL";
    }

    $query = $this->db->prepare("SELECT * FROM `comments2` WHERE `article_id` = $article_id AND `comment_parent` $parent_id ORDER BY `comment_timestamp` DESC");

    try{
        $query->execute();
        $comments = $query->fetchAll();                                     //returns an array
        $query->closeCursor();

        return $comments;

    } catch(PDOException $e){
        die($e->getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*eck 4

问题的核心是这样的:

$comments = $commentClass->fetch_article_comments($article_id);
Run Code Online (Sandbox Code Playgroud)

我假设,这个函数在某个地方创建并运行 SQL,这类似于SELECT ... WHERE comments.article_id=$article_id. 这还不够 - 你需要类似的东西

$comments = $commentClass->fetch_article_comments($article_id, $parent_id);
Run Code Online (Sandbox Code Playgroud)

翻译成 SQL 类似于SELECT ... WHERE comments.article_id=$article_id AND comments.comment_parent ($parent_id>0)?"=$parent_id":"IS NULL"

现在您可以编写 PHP 函数:

function display_comments ($article_id, $parent_id=0, $level=0) {
  $comments = $commentClass->fetch_article_comments($article_id, $parent_id);
  foreach($comments as $comment) {
        $comment_id = $comment['comment_id'];   
        $member_id = $comment['member_id'];
        $comment_text = $comment['comment_text'];
        $comment_timestamp = timeAgo($comment['comment_timestamp']);  //get time ago

        //render comment using above variables
        //Use $level to render the intendation level

        //Recurse
        display_comments ($article_id, $comment_id, $level+1);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后用display_comments ($article_id);