Помогите с выводом комментариев ( дерево )

186
26 ноября 2017, 15:27

Есть массив, первый параметр id, второй parent id и текст

$arr = array(
    array(1, 1, "Comment 1"),
    array(2, 1, "Comment 2"),
    array(3, 2, "Comment 3"),
    array(4, 1, "Comment 4"),
    array(5, 2, "Comment 5"),
    array(6, 3, "Comment 6"),
    array(7, 7, "Comment 7")
);

А результат должен быть таким

Comment 1
    Comment 2
        Comment 3
            Comment 6
        Comment 5
    Comment 4
Comment 7

Второй день пытаюсь решить и все мои решения дают один результат, вывод под parent_id соответствующий комментарий, но порядок тогда меняется или бесконечная рекурсия

Answer 1

Если перестроить массив по-другому, будет гораздо проще

$res = [];
foreach($arr as $i) {
  if ($i[0] == $i[1]) $i[1] = 0;
  $res[$i[1]][] = [ $i[0], $i[2] ];  
}
makeTree($res);
function makeTree($arr, $root = 0) {
    echo "<ul>\n";
    foreach($arr[$root] as $i) {
        echo "<li>\n";
        echo $i[1];
        if (isset($arr[$i[0]])) MakeTree($arr, $i[0]);
        echo "</li>\n";
    }
    echo "</ul>\n";
}

<ul> 
<li> 
Comment 1<ul> 
<li> 
Comment 2<ul> 
<li> 
Comment 3<ul> 
<li> 
Comment 6</li> 
</ul> 
</li> 
<li> 
Comment 5</li> 
</ul> 
</li> 
<li> 
Comment 4</li> 
</ul> 
</li> 
<li> 
Comment 7</li> 
</ul>

demo

READ ALSO
Сэмулировать POST на другой сайт

Сэмулировать POST на другой сайт

При сабмите формы, данные отправляются по указанному урлу методом post

230
Как сократить отображаемое число в PHP?

Как сократить отображаемое число в PHP?

Допустим имею данное число: 3985Как мне её превратить в данную строку: 3,9К ?

218
Как сделать 3-х уровневую реф-систему на PHP Mysql?

Как сделать 3-х уровневую реф-систему на PHP Mysql?

Приветствую, подскажите как построить логику 3-х уровневой реферальной системы на PHP и Mysql, например если был переход по реф ссылке в куки записывается...

215
Изменить текст QTextEdit при клике по нему в Qt

Изменить текст QTextEdit при клике по нему в Qt

Пишу калькулятор на С++ в Qt CreatorХочу сделать так, чтобы при клике по текстовому полю (когда там уже введен текст) старый текст убирался и ставился...

248