Laravel.io
function makeNested($elements, $parentId = 0, $parents = []) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element->parentId == $parentId) {
            array_merge($parents, [$element->hashId]);
           $children = makeNested($elements, $element->id, $parents);
            if ($children) {
                $element->children = $children;
                $element->parents = $parents;
            }
            $branch[$element->hashId] = $element;
        }
    }

    return $branch;
}

Please note that all pasted data is publicly available.