php 为什么我的数组是 Shuffle 两次而不是一次?

snz8szmq  于 2023-04-04  发布在  PHP
关注(0)|答案(1)|浏览(122)

我创建了一个关于http代码的问卷,这是一个100代码的例子:

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'
                ],
            ];
    }

我的formType:

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
        ]);
    }
}

最后是我的控制器:

<?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');
    }
}

在url为https://127.0.0.1:8001/的索引页上,我的第一个dump按顺序打印数组,dump 2和3打印它shuffled:

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"
  ]
]

但是当我提交表单时,dd再次打印我的数组shuffle:

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"
  ]
]

如果我删除dd,在表单提交后,我会被重定向到https://127.0.0.1:8001/?question=1,如果我再次提交,我会被重定向到https://127.0.0.1:8001/?question=2,但这次的数组与前一页相同,数组不再shuffe。
所以这意味着我的数组是shuffle两次:

  • 首先当我到达页面
  • 第二次当我提交第一份表格

但我只想我的数组 Shuffle 一次,当我到达localhost页
我不知道它为什么会这样,如果你有任何想法,这将是一种乐趣

5f0d552i

5f0d552i1#

当你提交一个表单时,你不需要传递question参数。

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

设置默认值$indiceQuestion = 0,并福尔斯数组重排的状态。
你可以像这样转换条件

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

或者检查其他条件,比如$session->get('questionsList')中是否存在值

相关问题