【发布时间】:2020-02-11 01:27:10
【问题描述】:
我有一个具有顶级 cmets 的评论系统,每个评论系统都可以有无限级别的回复 cmets。我正在尝试将所有评论 id 的列表按降序排列到一个数组中。
当我将结果回显时,PHP/SQL 代码运行良好。但是,我想以数组中的正确顺序结束 cmets 列表。似乎当数组变量通过递归例程传递时,它失败了。我理解这是 PHP 递归中的变量范围问题。
要得到我想要的东西,有什么办法?
我的代码:
//get all comments and descendants for post id
function get_comment_list($db,$post_id) {
$comment_array = array();
$sql = "SELECT comment_id FROM comments WHERE parent = 0 AND _post_id=".$post_id." "."ORDER BY dateTime DESC";
$result = $db->query($sql);
$q = $result->fetchAll(PDO::FETCH_COLUMN, 0);//one level array with '0' parameter
foreach($q as $parent){
echo $parent;echo '<br>';//first level parent comment
$comment_array[] = $parent;//store comment_id's
get_descendants($db,$parent,$comment_array);
}
return $comment_array;
}
//get all descendants of parent level comments
function get_descendants($db,$parent,$comment_array){
$sql = "SELECT comment_id FROM comments WHERE parent = $parent ORDER BY dateTime DESC";
$result = $db->query($sql);
$q = $result->fetchAll(PDO::FETCH_COLUMN, 0);//one level array with '0' parameter
foreach($q as $item){
echo ' '.$item;echo '<br>';
$comment_array[]=$item;//store comment_id's
get_descendants($db,$item,$comment_array);
}
}
$post_id = 199;
$comment_list = array();
$comment_list = get_comment_list($db,$post_id);
print_r($comment_list);
当我回显结果时,我得到了我想要的:
295
296
302
297
298
299
300
294
244
304
293
288
286
287
285
284
282
281
279
280
241
292
289
283
240
290
237
291
238
239
236
230
235
231
232
当我 print_r() 数组时,我只得到顶级 id。在递归调用期间没有添加后代。
295
294
244
241
240
237
236
230
或者,如果您可以建议一个递归的 MYSQL 查询来执行降序?
基本数据结构是:
comment_id comment parent post_id
parent 将comment_id 称为其父级。 parent = 0 是顶级父级。
【问题讨论】:
-
你只有一条comment_id=0的记录吗?
-
不,可以有多个父母的父母 = 0。比如说有人发布了一个视频。直接对帖子的评论将位于 parent = 0。对 cmets 的回复将具有 parent = comment_id... 启用嵌套或分层回复。