1

我有一个 MySQL 表idparent并且comment我设法从最新到最旧几乎按原样订购。如果评论没有父级,则设置为 0。

comments表格:表格图片

特此我当前的代码:

<?php

$con = mysqli_connect('host','username','password','database');

if (mysqli_connect_errno($con)) {
 echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$comments = array();
$results = mysqli_query($con,"SELECT * FROM comments ORDER BY id DESC");
while ($row = mysqli_fetch_assoc($results)) {
 $parent = $row['parent'];
 $comments[$parent ? $parent : 0][] = $row;                                        
}

function thread($parent,$comments) {
 foreach ($comments[$parent] as $post) {
  echo "<div>";
  echo $post['comment'];
  $id = $post['id'];
   if (isset($comments[$id])) {
    thread($id,$comments);
   }
  echo "</div>";
 }
}

thread(0,$comments);     

?>

上面的结果按以下顺序(为了便于阅读,变成了一个列表,您可以在代码中通过将 div 标签变成 li 并在 foreach 循环周围回显 ul 标签来做到这一点)

  • 第三条评论
  • 第二条评论
    • 对第二条评论的另一个回复
      • 还有一个
    • 回复第二条评论
      • 回复回复
  • 第一条评论
    • 回复第一条评论

请注意,回复也是按降序排列的,就像评论一样。除此之外,它完全没问题,并且像魅力一样工作。但这就是它应该的样子:

  • 第三条评论
  • 第二条评论
    • 回复第二条评论
      • 回复回复
    • 对第二条评论的另一个回复
      • 还有一个
  • 第一条评论
    • 回复第一条评论

简而言之:评论应该按降序排列,回复按升序排列。那是我完全陷入困境的地方。非常感谢你的帮助!!

4

1 回答 1

2

您可以使用该array_reverse函数来反转数组中项目的顺序:

$results = mysqli_query($con,"SELECT * FROM comments ORDER BY id DESC");
while ($row = mysqli_fetch_assoc($results)) {
    // ...
}

// Important bit: Reverse all threads except the main thread (id=0):
foreach ($comments as $key => $value) {
    if ($key !== 0) {
        $comments[$key] = array_reverse($value);
    }
}

function thread($parent,$comments) {
    // And so on...
于 2013-11-06T20:40:45.207 回答