respuestas - Jerarquía de comentario del sistema php
sistema de comentarios y respuestas php (1)
Quiero hacer disco / reddit / like sistema de comentarios, tengo un campo "id_answer" (establecido en 0 por defecto) en mi base de datos de comentarios y cuando el usuario responde a otro comentario, este campo es el "id" del comentario principal.
Tengo los comentarios del hilo en una matriz, pero no sé cómo filtrar el filtro de cada ciclo para obtener algo como esto:
comment lvl 1 ($ array [id_answer] es 0)
------- comment lvl 2 ($ array [id_answer] es id_of_level_one_comment)
--------------- comentario lvl 3 ...
Use tres campos en su base de datos;
- "id", único para cada comentario
- "parent_id", que es 0 (comentario de nivel superior) o el "id" del comentario principal
- "thread_id", que es la identificación de lo que está comentando
Digamos que desea mostrar el árbol de comentarios para su artículo de noticias con la identificación "123"
Al seleccionar desde mysql, seleccione todo con este thread_id:
SELECT id, parent FROM comments WHERE thread_id = 123
Luego, debe realizar un análisis previo de su matriz para que los niños le comenten a sus padres y usar una pantalla recursiva para mostrar cada comentario y su lista de niños.
Por ejemplo:
// getting the comments from mysql, I''m obviously not bothering
// to check the return value, but in your code you should do it
$result = mysqli_query("SELECT id, parent FROM comments WHERE thread_id = 123");
$comments = array();
while ($row = mysqli_fetch_array($result)) {
$row[''childs''] = array();
$comments[$row[''id'']] = $row;
}
// This is the array you get after your mysql query
// Order is non important, I put the parents first here simply to make it clearer.
/*
$comments = array(
// some top level (parent == 0)
1 => array(''id'' => 1, ''parent'' => 0, ''childs'' => array()),
5 => array(''id'' => 5, ''parent'' => 0, ''childs'' => array()),
2 => array(''id'' => 2, ''parent'' => 0, ''childs'' => array()),
10 => array(''id'' => 10, ''parent'' => 0, ''childs'' => array()),
// and some childs
3 => array(''id'' => 3, ''parent'' => 1, ''childs'' => array()),
6 => array(''id'' => 6, ''parent'' => 2, ''childs'' => array()),
4 => array(''id'' => 4, ''parent'' => 2, ''childs'' => array()),
7 => array(''id'' => 7, ''parent'' => 3, ''childs'' => array()),
8 => array(''id'' => 8, ''parent'' => 7, ''childs'' => array()),
9 => array(''id'' => 9, ''parent'' => 6, ''childs'' => array()),
);
*/
// now loop your comments list, and everytime you find a child, push it
// into its parent
foreach ($comments as $k => &$v) {
if ($v[''parent''] != 0) {
$comments[$v[''parent'']][''childs''][] =& $v;
}
}
unset($v);
// delete the childs comments from the top level
foreach ($comments as $k => $v) {
if ($v[''parent''] != 0) {
unset($comments[$k]);
}
}
// now we display the comments list, this is a basic recursive function
function display_comments(array $comments, $level = 0) {
foreach ($comments as $info) {
echo str_repeat(''-'', $level + 1).'' comment ''.$info[''id'']."/n";
if (!empty($info[''childs''])) {
display_comments($info[''childs''], $level + 1);
}
}
}
display_comments($comments);
Esto da el siguiente resultado:
- comment 1
-- comment 3
--- comment 7
---- comment 8
- comment 5
- comment 2
-- comment 6
--- comment 9
-- comment 4
- comment 10
Dejo la ORDEN POR y tal como usted, ya que no debería plantear ningún problema.