У меня есть система комментариев, которая имеет комментарии верхнего уровня, и у каждого из них может быть бесконечный уровень комментариев. Я пытаюсь получить список всех идентификаторов комментариев в порядке убывания в массив.
Код PHP / SQL работает нормально, когда я просто выводю результаты. Однако я хотел бы закончить список комментариев в правильном порядке в массиве. Кажется, когда переменная массива передается через рекурсивные подпрограммы, происходит сбой. Я понимаю, что это проблема переменной области действия в рекурсии 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
Когда я печатаю массив, я получаю только идентификаторы верхнего уровня. Потомки не были добавлены во время рекурсивных вызовов.
295
294
244
241
240
237
236
230
Или, если вы можете предложить рекурсивный запрос MYSQL, который будет выполнять убывание в порядке?
Базовая структура данных:
comment_id comment parent post_id
parent будет ссылаться на comment_id как на своего родителя. parent = 0 - родитель верхнего уровня.