actorRepository->findOneRandom(4); $game = new Game(); $game->setMainActor($mainActor); $game->setUser($user); $usedActors = [$mainActor->getId()]; $rowOrder = 0; foreach (str_split(strtolower($mainActor->getName())) as $char) { if (!preg_match('/[a-z]/', $char)) { continue; } $tryFindActor = 0; do { $actor = $this->actorRepository->findOneRandom(4, $char); ++$tryFindActor; } while ( in_array($actor->getId(), $usedActors) || $tryFindActor < 5 ); $usedActors[] = $actor->getId(); $row = new GameRow(); $row->setActor($actor); $row->setPosition(strpos(strtolower($actor->getName()), $char)); $row->setRowOrder($rowOrder); $game->addRow($row); ++$rowOrder; } $this->em->persist($game); $this->em->flush(); return $game; } /** * Compute display data (grid, width, middle) from a Game entity for the React component. * * @return array{grid: list, width: int, middle: int} */ public function computeGridData(Game $game): array { $leftSize = 0; $rightSize = 0; $grid = []; foreach ($game->getRows() as $row) { $actor = $row->getActor(); $pos = $row->getPosition(); if ($leftSize < $pos) { $leftSize = $pos; } $rightSizeActor = strlen($actor->getName()) - $pos - 1; if ($rightSize < $rightSizeActor) { $rightSize = $rightSizeActor; } $grid[] = [ 'actorName' => $actor->getName(), 'actorId' => $actor->getId(), 'pos' => $pos, ]; } return [ 'grid' => $grid, 'width' => $rightSize + $leftSize + 1, 'middle' => $leftSize, ]; } }