setRepository->find($setId); if ($set === null) { throw new NotFoundException('set not found'); } $elementsByParentId = []; foreach ($this->elementRepository->findBySet($set) as $element) { $parentId = $element->getParentElement()?->getId() ?? 0; $elementsByParentId[$parentId][] = $element; } foreach ($elementsByParentId as &$siblings) { usort($siblings, function ( Element $first, Element $second, ): int { $positionComparison = $first->getPosition() <=> $second->getPosition(); if ($positionComparison !== 0) { return $positionComparison; } return $first->getId() <=> $second->getId(); }); } unset($siblings); return new SetLayout( set: $set, elements: $this->buildNodes(0, $elementsByParentId), ); } /** * @param array> $elementsByParentId * @return list */ private function buildNodes( int $parentId, array $elementsByParentId, ): array { $nodes = []; foreach ($elementsByParentId[$parentId] ?? [] as $element) { $nodes[] = new ElementLayoutNode( element: $element, children: $this->buildNodes( $element->getId(), $elementsByParentId, ), ); } return $nodes; } }