Maison  >  Questions et réponses  >  le corps du texte

Pourquoi mon tableau est-il mélangé deux fois au lieu d'une ?

J'ai créé un questionnaire sur les codes http, voici un exemple de 100 codes :

public static function list(): array
    {
        return
            [
                [
                    'http_message' => 'Continue',
                    'http_code' => '100'
                ],
                [
                    'http_message' => 'Switching Protocols',
                    'http_code' => '101'
                ],
                [
                    'http_message' => 'Processing',
                    'http_code' => '102'
                ],
                [
                    'http_message' => 'Early Hints',
                    'http_code' => '103'
                ],
            ];
    }

Puis mon formulaire tape :

class QuizControllerType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('response', TextType::class, [
                'attr' => ['autofocus' => true]
            ])
            ->add('submit', SubmitType::class, array(
                'label' => 'Suivant'
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

Enfin ma manette :

<?php

namespace App\Controller;

use App\Form\QuizControllerType;
use App\Service\HttpCodeService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class QuizController extends AbstractController
{
    #[Route('/', name: 'app_quiz')]
    public function index(Request $request): Response
    {
        $session = $request->getSession();

        $form = $this->createForm(QuizControllerType::class);

        $indiceQuestion = $request->query->get('question', 0);

        if (0 === $indiceQuestion) {
            $session->clear();
            $questionsList = InformationCodeService::list();
            dump(1,$questionsList);
            shuffle($questionsList);
            dump(2,$questionsList);
            $responses = array_column($questionsList, 'http_code');
            $session->set('questionsList', $questionsList);
            $session->set('responses', $responses);
            $session->set('responseFromUser', []);
        }

        $responseFromUser = $session->get('responseFromUser');

        $message = \count($session->get('questionsList')) > $indiceQuestion ? $session->get('questionsList')[$indiceQuestion]['http_message'] : '';

        $form->handleRequest($request);

        if ('' === $message) {
            dump('je passse');
            $results = [];

            $responses = $session->get('responses');
            $questionsList = $session->get('questionsList');

            for ($i = 0; $i < count($responseFromUser); $i++) {
                if ($responseFromUser[$i] === $responses[$i]) {
                    $results[$i] = $responseFromUser[$i];
                }
            }

            $score = \count($results). ' / '. \count($questionsList);
            $session->set('score', $score);
            return $this->redirectToRoute('app_quiz_finish');
        }

        dump(3,$session->get('questionsList'));

        if ($form->isSubmitted() && $form->isValid()) {
            dd($session->get('questionsList'));
            $response = $form->getData()['response'];
            $responseFromUser[] = $response;
            $session->set('responseFromUser', $responseFromUser);
            $indiceQuestion++;
            dd($indiceQuestion);

            return $this->redirectToRoute('app_quiz', ['question' => $indiceQuestion]);
        }

        return $this->render('quiz/index.html.twig', [
            'form' => $form->createView(),
            'message' => $message,
            'indice_question' => $indiceQuestion,
            'total_question' => \count($session->get('questionsList'))
        ]);
    }
    #[Route('/finish', name: 'app_quiz_finish')]
    public function finish(): Response
    {
        return $this->render('quiz/finish.html.twig');
    }
}

Sur la page d'index à l'url https://127.0.0.1:8001/, mon premier dump imprime le tableau dans l'ordre, les dumps 2 et 3 s'impriment dans le désordre :

array:4 [▼
  0 => array:2 [▼
    "http_message" => "Early Hints"
    "http_code" => "103"
  ]
  1 => array:2 [▼
    "http_message" => "Processing"
    "http_code" => "102"
  ]
  2 => array:2 [▼
    "http_message" => "Continue"
    "http_code" => "100"
  ]
  3 => array:2 [▼
    "http_message" => "Switching Protocols"
    "http_code" => "101"
  ]
]

Mais lorsque je soumets le formulaire, dd imprime à nouveau mon tableau aléatoire :

array:4 [▼
  0 => array:2 [▼
    "http_message" => "Processing"
    "http_code" => "102"
  ]
  1 => array:2 [▼
    "http_message" => "Switching Protocols"
    "http_code" => "101"
  ]
  2 => array:2 [▼
    "http_message" => "Continue"
    "http_code" => "100"
  ]
  3 => array:2 [▼
    "http_message" => "Early Hints"
    "http_code" => "103"
  ]
]

Je ne comprends pas pourquoi cela est fait. Si je supprime dd,提交表单后,我将使用不同的数组重定向到 https://127.0.0.1:8001/?question=1 ,如果我再次提交,我将重定向到 https://127.0.0.1 :8001/?question=2 mais cette fois il utilise le même tableau que la page précédente et le tableau n'est plus aléatoire.

Cela signifie donc que mon tableau est mélangé deux fois :

Mais je ne souhaite mélanger le tableau qu'une seule fois en atteignant la page localhost

Je ne sais pas pourquoi il fait ça, si vous avez des idées, ce serait amusant

P粉818561682P粉818561682237 Il y a quelques jours276

répondre à tous(1)je répondrai

  • P粉189606269

    P粉1896062692024-03-20 10:51:44

    Lorsque vous soumettez le formulaire, vous ne transmettez pas le paramètre question. Alors le code

    $indiceQuestion = $request->query->get('question', 0);
    

    Définissez la valeur par défaut$indiceQuestion = 0 et tombez à nouveau dans la situation du chaos du tableau.

    Vous pouvez convertir les conditions comme celle-ci

    if (0 === $indiceQuestion && !$form->isSubmitted())
    

    Ou vérifiez d'autres conditions, par exemple si une valeur existe dans $session->get('questionsList')

    répondre
    0
  • Annulerrépondre