我有一个带有 id
、parent
和 comment
的 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/