. // }}} namespace Plugin\TreeNotes; use App\Core\Modules\Module; use App\Entity\Note; class TreeNotes extends Module { /** * Format the given $notes_in_trees_out in a list of reply trees */ public function onFormatNoteList(array &$notes_in_trees_out) { $roots = array_filter($notes_in_trees_out, function (Note $note) { return $note->getReplyTo() == null; }, ARRAY_FILTER_USE_BOTH); $notes_in_trees_out = $this->build_tree($roots, $notes_in_trees_out); } private function build_tree(array $parents, array $notes) { $subtree = []; foreach ($parents as $p) { $subtree[] = $this->build_subtree($p, $notes); } return $subtree; } private function build_subtree(Note $parent, array $notes) { $children = array_filter($notes, function (Note $n) use ($parent) { return $parent->getId() == $n->getReplyTo(); }, ARRAY_FILTER_USE_BOTH); return ['note' => $parent, 'replies' => $this->build_tree($children, $notes)]; } }