PHP/MySQL - 线程需要稍微不同的顺序

标签 php mysql loops

我有一个带有 idparentcomment 的 MySQL 表,我设法从最新到最老的。如果评论没有父级,则设置为 0。

comments 表:Table Image

在此我当前的代码:

<?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 标签来做到这一点):

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

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

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

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

最佳答案

您可以使用 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...

关于PHP/MySQL - 线程需要稍微不同的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822062/

相关文章:

javascript - 使用js验证输入

php - 如何使用 PHPUnit 数据库扩展表示 CSV 数据集中的 NULL 字符

php - 使用 php 和 mysql 打印基于 csv 的名称列表的最有效方法

JQuery 循环克隆

java - HashMap 通过 SOAP 从 Java 到 PHP 再返回

php - 如何处理解析和 fatal error ?

php - PHP 网页的英语到阿拉伯语翻译

mysql无法创建表errno 121

jquery - 仅追加一次 Jquery

不使用 strcmp 检查密码 (C)