PHP中访问多个数组时如何避免重复遍历实现空输入错误提示
解决方法
你遇到的重复遍历问题可以通过答案索引和题目索引一一对应的逻辑解决,不用嵌套多层循环,整体只需要2次遍历(1次校验提交内容,1次渲染题目)即可实现错误对应展示。
你原有代码还有一处无效冗余逻辑:遍历题目时多余的foreach ($qn as $value)没有实际作用,只会重复输出<h3>标签,以下是修正后的完整代码:
<?php // 存储抽选的4道题 $four_qn = array(); $message = ""; $score = 0; $ans = array(); // 题库多维数组 $qn_array = array( 1 => array( 'Question' => "In which novel of Roald Dahl, the character Willy Wonka can be found?", 'Answer'=> "charlie and the chocolate factory" ), 2 => array( 'Question' => "‘West Side Story,’ a musical is based on a tragedy by Shakespeare. Which tragedy is it?", 'Answer' =>"romeo and juliet" ), 3 => array( 'Question' => "Who became the best-selling author in the 2000s in Britain?", 'Answer' => "jk rowling" ), 4 => array( 'Question' => "What is the name the novel by George Orwell where we find the character ‘Napoleon’?", 'Answer' => "animal farm" ), 5 => array( 'Question' => "Tweedledum and Tweedledee are two characters of which Children’s book?", 'Answer' => "alice in wonderland" ), 6 => array( 'Question' => "Name the mega-selling writer who has written “Deception Point”?", 'Answer' => "dan brown" ), 7 => array( 'Question' =>"‘A Brief History of Time’ is a famous book written in 1988. Who is its author?", 'Answer' => "stephen hawking" ), 8 => array( 'Question' => "Who ended his writing career with ‘The Last Tycoon’?", 'Answer' => "F scott fitzgerald" ), 9 => array( 'Question' => "What literary tale contains the phrase “fee, fie, fo, fum”?", 'Answer' => "jack and the beanstalk" ), 10 => array( 'Question' => "Theodor Geisel used what pen name when writing his children’s books?", 'Answer' => "dr seuss") ); shuffle($qn_array); // 随机打乱题库 $four_qn = array_slice($qn_array, 0, 4); // 固定取前4道题,避免原逻辑索引越界问题 $formValid = true; $errors = array(); // 校验提交的答案 if (isset($_POST['submit'])) { $ans = $_POST['ans']; foreach($ans as $key => $value) { if (empty(trim($value))) { // 加trim避免用户只输入空格绕过校验 $errors[$key] = "<span style='color:red'>请输入答案</span>"; $formValid = false; } } } ?> <body> <div class ="quiz"> <label name="Header" class="Header">文学测验</label> <form method="post" action="lit1.php"> <div class="Questions"> <?php $count = 1; // 遍历4道题渲染 foreach ($four_qn as $qn) { // 输出题目 echo "<h3>".$count . ") " . $qn['Question']."</h3>"; $currentIndex = $count - 1; // 和提交的ans数组索引对应,从0开始 ?> <div class ="Answers"> <input type="text" name="ans[]" value="<?php echo isset($ans[$currentIndex]) ? htmlspecialchars($ans[$currentIndex]) : ''; ?>"> <?php // 直接判断当前索引是否有错误,有就输出,不需要循环errors数组 if (isset($errors[$currentIndex])) { echo $errors[$currentIndex]; } ?> </div> <?php $count++; } ?> <div class = "submit"> <input type="submit" name="submit" value="提交答案"> </div> <div class="attempt"> <input type="button" name="attempt" value="重新作答"> </div> </div> </div> </form>
核心修改点
- 取消了渲染错误时的嵌套循环,直接用当前题目的顺序索引匹配错误数组的对应key,单循环即可完成所有内容渲染,没有冗余遍历
- 补充了输入框的默认值回填,用户提交后不需要重新输入已填内容
- 修正了原代码截取题目的逻辑,避免索引越界问题
- 校验空值时增加了trim处理,避免用户输入空格绕过校验
内容的提问来源于stack exchange,提问作者HelpAGirlOut
相关产品推荐
相关产品推荐

