Created
March 5, 2015 14:16
-
-
Save fabiopiovam/2c6f99e3ed5079f2e94c to your computer and use it in GitHub Desktop.
Hierarchy commenting system php using self-relation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* Solution to list with hierarchy using self-relation | |
* Found here: http://stackoverflow.com/questions/7730889/hierarchy-commenting-system-php | |
* */ | |
// 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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment