Manuel Gerardo Flores Quiñonez
Gabriel Estacio
Hola, muchas gracias por tu aporte, sin embargo me queda una duda: Hay alguna manera de obtener solamente el valor de la variable $palabras en vez de todo el archivo .php?
Leonardo Rios Pineda
Construir un sistema de análisis que valide respuestas de forma dinámica requiere atención al detalle y dominio de estructuras de control. Aquí se aborda cómo pasar de validaciones estáticas a un ciclo for dinámico en PHP, corregir errores comunes y entregar feedback preciso al usuario en un juego de ordenamiento de palabras.
¿Por qué el formulario solo mostraba un valor en lugar de seis?
Al enviar seis inputs desde el formulario, el resultado solo mostraba un elemento en el array y únicamente tres líneas de feedback. El problema radicaba en cómo se construían los nombres de cada input de forma dinámica [01:28].
Dentro del ciclo que genera los campos del formulario, se estaba usando la notación de corchetes para acceder a una posición del array completo. Sin embargo, lo correcto es utilizar solo la variable de iteración ($i) como parte del nombre. Al eliminar los corchetes innecesarios, cada input recibe un nombre único (palabra0, palabra1, palabra2...) y el servidor puede capturar todos los valores enviados [01:55].
Tras este ajuste, al recargar y enviar nuevamente los datos, el array muestra las seis posiciones completas con sus respectivos valores: sol, luna, cielo, luz, estrellas y lluvia [02:45].
¿Cómo reemplazar validaciones repetitivas con un ciclo for?
El archivo de análisis contenía tres validaciones escritas manualmente, una para cada posición. Esto no escala cuando el array crece. La solución es aplicar un ciclo for dinámico que recorra todas las posiciones automáticamente [03:15].
¿Qué papel cumple la función count?
La función count() determina cuántos elementos tiene el array de palabras. Ese valor se convierte en el límite de iteraciones del ciclo, de modo que sin importar si hay tres, seis o veinte palabras, el ciclo se adapta [03:35].
¿Cómo se construye la validación dinámica?
Dentro del ciclo, se compara el valor recibido por $_REQUEST con la palabra almacenada en la misma posición del array. El nombre del campo se arma por concatenación: la cadena "palabra" más la variable de iteración $i [03:50].
<br> para mantener la salida organizada visualmente.Una vez implementado el ciclo, las validaciones manuales anteriores se pueden eliminar por completo. Una sola estructura de control reemplaza múltiples bloques de código repetido [04:40].
¿Qué enseñanza deja el error de nombre de variable?
Al probar por primera vez el ciclo, la palabra correcta no aparecía en el mensaje de error. El problema fue un typo: se escribió $palabra en lugar de $palabras, que era el nombre real del array [05:20].
else porque comparaba contra una variable inexistente.Este tipo de error es extremadamente común y refuerza una práctica fundamental: mantener total conciencia del nombre de tus variables. Leer el código con calma, verificar la lógica y confirmar que cada identificador esté escrito correctamente evita horas de frustración [06:55].
Tras corregir el nombre, el sistema funciona como se espera. Las palabras correctas muestran su confirmación y las incorrectas revelan la respuesta esperada [06:00].
¿Cómo limpiar la vista para el usuario final?
Durante el desarrollo se utilizó print_r para verificar los datos recibidos del formulario. Esta línea cumplía una función de depuración para el desarrollador, no para el usuario final [07:00].
Este paso representa la transición de un entorno de pruebas a una experiencia de usuario pulida.
Cuando algo no funcione como esperas, no entres en pánico. Regresa al código, revisa el sentido lógico y verifica la ortografía de cada variable. Cada error resuelto suma experiencia para construir aplicaciones más robustas y optimizadas. ¿Qué otro tipo de validación agregarías a este juego? Comparte tu idea en los comentarios.
Logre llegar hasta este punto
Manuel Gerardo Flores Quiñonez
Gabriel Estacio
Hola, muchas gracias por tu aporte, sin embargo me queda una duda: Hay alguna manera de obtener solamente el valor de la variable $palabras en vez de todo el archivo .php?
Leonardo Rios Pineda
Aldo Miguel Ortiz Parodi
14. Finalizando nuestro juego
Les comparto el código hecho en clase:
Esto corresponde al archivo analisis.php:
<?php //print_r($_REQUEST); $wordsList = ["sol", "luna", "cielo", "luz", "estrellas", "lluvia"]; for ($i=0; $i < count($wordsList); $i++) { if($_REQUEST["word".$i] == $wordsList[$i]) { echo "La palabra ingresada es correcta.<br>"; } else { echo "La palabra ingresada es incorrecta, y la palabra correcta es: $wordsList[$i].<br>"; } }
Cesar Alfredo Llacta Quispe
Me salió bien por fin!!
Víctor Adrián Ramírez de la Cruz
gran curso
Carlos Andrés Aristizabal
Juan Felipe Florez Giraldo
main
<?php $words = array("moon", "soccer", "playing"); $form = "<form action ='analysis.php'>"; //* makes messy words for($i = 0; $i < count($words); $i++){ $form .= "The word: " . str_shuffle($words[$i]) ." ". "<input type='text' name='word". $i ."'>" . "<br>"; } $button = "<button type='submit'>Send</button>"; $formClose = "</form>"; echo $form . $button . $formClose; ?> <?php analisis $words = array("moon", "soccer", "playing"); for ($i=0; $i <count($words) ; $i++) { if($_REQUEST["word" .$i] == $words[$i]) { echo "The word is correct. " . "<br>"; }else { echo "The word is incorrect, the word is: " . $words[$i] . "<br>"; } } ?>Juan Carlos Sulbaran
Luis Rodriguez
muy buena explicacion va paso a paso...
Sebastian Beltran Zapata
Aldo Yael Cordoba Ortiz
No encuentro el error, me dice que todas las palabras son incorrectas, pero no veo en que me estoy equivocando...
<?php print_r($_REQUEST); $palabras = array("sol","luna","cielo","luz","estrellas","lluvia"); for ($i=0; $i < count($palabras); $i++) { if($_REQUEST["palabra".$i] == $palabras[$i]){ echo "La palabra es correcta"."<br>"; } else { echo "La palabra es incorrecta"."<br>"; } } ?>
Alvaro H. Ruiz V.
Pregunta! Hay alguna manera de deshabilitar el autocompletado del formulario en PHP? ;)
Florian Martinez
Buenos días, si hay una manera de quitar el autocomplete del formulario. Para eso tu debes agregar en tu declaración de formulario un atributo "autocomplete="off" para que ninguno de tus campos se llene de manera automático.
<code> <form action="action_page.php" autocomplete="off">
Si quieres que solo un campo no te lo permita, tienes que poner el “autocomplete=off” a los campos en especifico Espero que te ayude. ¡Nunca pares de aprender!
Andrés Schuster
Juan Manuel Alemán Rodríguez
Hola Andrés, no es necesario que utilices el include o el require ya que esas sentencias solo se usan para agregar un script con funciones o código extra que quisieras usar sin necesidad de escribirlo en el actual fichero, en el caso de tu codigo ya estas enviando el array desde el archivo main.php mediante el formulario:
$form = "<form action='./validate.php'>";
Con lo anterior le estarías enviando los datos del ingresados en el input y en el script validate.php los recibiría y posteriormente los leerías con $_REQUEST. Todo lo anterior sin nececidad de agregar el fichero main.php en el script de validate.php, abajo te dejo los enlaces de la documentación de la sentencia include, espero sea de utilidad.
Antonio Cortes Avila
Wilman Perilla
<?php /* print_r($_REQUEST); $palabras = array("sol","luna","cielo","luz","estrellas","lluvia"); if($_REQUEST["palabra0"]==$palabras[0]){ echo "la palabra ingresada es correcta </br>"; }else{ echo "la palabra ingresada no es correcta, la palabra correcta es: ".$palabras[0]."</br>"; } if($_REQUEST["palabra1"]==$palabras[1]){ echo "la palabra ingresada es correcta"."</br>"; }else{ echo "la palabra ingresada no es correcta, la palabra correcta es:".$palabras[1]."</br>"; } if($_REQUEST["palabra2"]==$palabras[2]){ echo "la palabra ingresada es correcta"."</br>"; }else{ echo "la palabra ingresada no es correcta, la palabra correcta es:".$palabras[2]."</br>"; } */ print_r($_REQUEST); $palabras = array("sol","luna","cielo","luz","estrellas","lluvia"); for($i=0; $i<count($palabras);$i++){ if($_REQUEST["palabra".$i]==$palabras[$i]){ echo "la palabra ingresada es correcta"."<br>"; }else{ echo"la palabra ingresada es incorrecta, la palabra correcta es:". $palabras[$i]."<br>"; } } ?>
Wilman Perilla
$palabras = array("sol","luna","cielo","luz","estrellas","lluvia"); $form = "<form action='analisis.php'>"; for($i=0;$i<count($palabras);$i++){ $form .="la palabra:".str_shuffle($palabras[$i])." "."<input type ='text' name='palabra".$i."'>"."<br>"; } $button = "<button type='submit'>Enviar</button>"; $formcierre = "</form>"; echo $form.$button.$formcierre; ?>
Paulo José Ismalej Guzmán
Juan Omar Palma álvarez
[](
Juan Omar Palma álvarez
; $i++) { if ($_REQUEST["palabra" . $i] === $palabras[$i]) { echo "Si es esa palabra." . "<br>"; } else { echo "Incorrecto, la solucion es: " . $palabras[$i] . "<br>"; } }
No se que tan buena practica sea usar session_start(); para obtener las varibles entre archivos pero quedaria asi.
En el archivo index.php declaramos el arreglo.
session_start(); $palabras = $_SESSION['palabras'] = array("sol", "luna", "cielo", "luz", "estrellas", "lluvia");
En el archivo analisis.php lo recuperamos.
session_start(); $palabras = $_SESSION['palabras'];
Tratando de mejorar la presentación y organización del proyecto llegué a esta solución donde además de los archivos index.php (formulario inicial) y result.php (resultados) agregue uno más: controller.php. En controller.php manejo el array al que tendrán acceso las dos páginas de presentación y en ellas tan solo 'pinto' lo que se necesita. Adicional también investigué un poco tratando de organizar mejor el resultado en el html. ¡Anexo los ejemplos!
Estructura de archivos:
index.php
<?php require_once "controller.php"; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Put the words in order</title> <link rel="stylesheet" href="style.css"> </head> <body> <h2>Put the words in order</h2> <p>Escribe correctamente las siguientes palabras</p> <form action='result.php'> <?php for ($i = 0; $i < count($words); $i++) : ?> <label for="word_<?= $i ?>"><?= str_shuffle($words[$i]) ?></label> <input type="text" name="word_<?= $i ?>"> <?php endfor ?> <button type='submit'>Analizar resultados</button> </form> </body> </html>
result.php
<?php require_once "controller.php"; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Put the words in order</title> <link rel="stylesheet" href="style.css"> </head> <body> <h2>Put the words in order</h2> <p>Estos son los resultados de tu intento</p> <div class="result"> <?php for ($i = 0; $i < count($words); $i++) : ?> <?php if ($_REQUEST["word_" . $i] === $words[$i]) : ?> <p><span class="score">¡Acertaste!</span> La palabra ingresada es correcta</p> <?php else : ?> <p><span class="fail">¡Fallaste!</span> La palabra correca es <strong><?= $words[$i] ?></strong></p> <?php endif ?> <?php endfor ?> </div> <button type="button" onclick="window.open('index.php', '_self')">Volver a jugar</button> </body> </html>
controller.php
<?php $words = [ "sol", "luna", "cielo", "casa", "perro", ];
style.css
* { box-sizing: border-box; font-family: sans-serif; } body { padding: 0; margin: 0; display: flex; justify-content: center; align-items: center; flex-direction: column; width: 100%; height: 100%; min-height: 100vh; background-color: azure; } h1 { text-transform: capitalize; margin-bottom: 0; color: darkslateblue; } input[type='text'], label { display: block; } form { width: 500px; } label { margin: 0.5em 0 0.2em; } input[type='text'] { width: 100%; padding: 0.8em 1em; border: 1px solid grey; } button { padding: 1em 1.5em; background-color: darkslateblue; color: whitesmoke; border: none; border-radius: 2em; text-transform: uppercase; margin: 2em; margin-inline: auto; display: block; text-decoration: none; } .score, .fail { padding: 0.5em 1em; display: inline-block; border-radius: 2em; } .score { background-color: greenyellow; } .fail { background-color: crimson; }
Aquí mi aporte.
la unica diferencia es que utilice include para traerme el array desde el archivo main.
Aquí mi código del main.php
<?php $wordsArray = array("sol", "luna", "cielo", "luz", "estrella", "lluvia"); $form = "<form action='./validate.php'>"; for ($i=0; $i < count($wordsArray); $i++) { $form.= "Escribe correctamente la palabra: ".str_shuffle( $wordsArray[$i]). "<input type='text' name='word".$i."' >". "<br/>"; } $button ="<button type='submit'>Enviar</button>"; $formClose = "</form>"; echo $form.$button.$formClose; ?>
Y aqui el de el archivo que valida
<?php include_once './main.php'; for ($i=0; $i < count($wordsArray); $i++) { if($_REQUEST["word".$i] == $wordsArray[$i]){ echo "La palabra ingresada es correcta <br/>"; } else { echo "La palabra ingresada es incorrecta. La palabra correcta es: ". $wordsArray[$i] . '<br/>'; } } ?>
Mi duda es que al uilizar require se me imprime todo el formulario nuevamente en el archivo de validación.
Cómo pudiera traer solo el array sin imprimir el contenido de main.php en el archivo de validate.php?
<!doctype html> <html lang="es"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Curso PHP | Microproyecto: Juego de Ordenamiento</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" > <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> </head> <body> <?php include 'navbar.php'; ?> <div class="container mt-3"> <h4>Microproyecto: Juego de Ordenamiento</h4> <div class="card p-3 mt-3"> <form action="" method="POST" class=""> <?php $palabras = ["sol", "luna", "cielo", "estrellas", "lluvia", ]; for ($i=0; $i<count($palabras) ; $i++) { echo "La palabra: " . str_shuffle($palabras[$i]) . " "; echo "<input type='text' class='form-control form-control-sm mb-3' name='palabra" . $i . "'>"; } ?> <button type="submit" class="btn btn-primary btn-sm w-100">Enviar</button> </form> </div> <div class="card p-3 mt-3"> <h4>Entradas</h4> <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // print_r($_REQUEST); // echo "<br><br>"; for($i=0; $i<count($palabras) ; $i++){ if($_REQUEST["palabra$i"] == $palabras[$i]){ echo "La palabra ingresada es CORRECTA!!!"; echo "<br>"; }else{ echo "La palabra ingresada es incorrecta, la respuesta correcta es: " . $palabras[$i]; echo "<br>"; } } } ?> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"> </script> </body> </html> ```\<!doctype html>\<html lang="es"> \<head> \<meta charset="utf-8"> \<meta name="viewport" content="width=device-width, initial-scale=1"> \<title>Curso PHP | Microproyecto: Juego de Ordenamiento\</title> \<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" > \<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">\</head> \<body> \<?php include 'navbar.php'; ?> \<div class="container mt-3"> \<h4>Microproyecto: Juego de Ordenamiento\</h4> \<div class="card p-3 mt-3"> \<form action="" method="POST" class=""> \<?php  $palabras = \["sol", "luna", "cielo", "estrellas", "lluvia", ]; for ($i=0; $i\<count($palabras) ; $i++) { echo "La palabra: " . str\_shuffle($palabras\[$i]) . " "; echo "\<input type='text' class='form-control form-control-sm mb-3' name='palabra" . $i . "'>"; } ?> \<button type="submit" class="btn btn-primary btn-sm w-100">Enviar\</button> \</form> \</div> \<div class="card p-3 mt-3"> \<h4>Entradas\</h4> \<?php if ($\_SERVER\['REQUEST\_METHOD'] === 'POST') { // print\_r($\_REQUEST); // echo "\<br>\<br>"; for($i=0; $i\<count($palabras) ; $i++){ if($\_REQUEST\["palabra$i"] == $palabras\[$i]){ echo "La palabra ingresada es CORRECTA!!!"; echo "\<br>"; }else{ echo "La palabra ingresada es incorrecta, la respuesta correcta es: " . $palabras\[$i]; echo "\<br>"; } } } ?> \</div> \</div> \<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"> \</script>\</body> \</html>
Le comparto el codigo del formulario
y del codigo php que valida las respuestas.
<?php $palabras_correctas = array( "palabra1" => "Sol", "palabra2" =>"Luna", "palabra3" =>"Tierra", "palabra4" =>"Aire", "palabra5" =>"Fuego", "palabra6" =>"Lluvia", "palabra7" =>"Trueno", "palabra8" =>"Atmosfera",); $palabras_desordenadas = array(); foreach ( $palabras_correctas as $palabra => $indice){ $palabras_desordenadas[$palabra] = str_shuffle($indice); } $html = "<form action='analiza.php' method='post'> "; foreach ($palabras_desordenadas as $indice => $p) { $html .= " <ul> <label for='$indice'>$p</label> <input type='text' name= '$indice'> </ul> "; } $html .= " <button type='submit'> Validar </button> </form>"; echo $html; ?> ``````js <?php $palabras_correctas = array( "palabra1" => "Sol", "palabra2" =>"Luna", "palabra3" =>"Tierra", "palabra4" =>"Aire", "palabra5" =>"Fuego", "palabra6" =>"Lluvia", "palabra7" =>"Trueno", "palabra8" =>"Atmosfera",); $html = "<html><table border=1>"; foreach ($_REQUEST as $indice => $palabra) { $html .= "<tr><td>"; if ( $palabra == $palabras_correctas[$indice] ) $html .= "La respuesta a la $indice es Correcta " ; else $html .= "La respuesta a la $indice es Incorrecta " ; $html .= "</tr></td>"; } $html .= "</html></table>"; print_r($html); ?>
Actualización del juego 💚.
Main
<?php //* Palabras iniciales $palabras = ["sol", "luna", "cielo", "luz", "estrellas", "lluvia"]; $form = "<form action='analisis.php' >"; // *Mezcla de palabras for ($i = 0; $i < count($palabras); $i++) { $form .= "La palabra:" . str_shuffle($palabras[$i]) . " " . "<input type='text' name='palabra" . $i . "'>" . "<br/>"; } $button = "<button type='submit'>Enviar 😎</button>"; $formcierre = "</form>"; echo $form . $button . $formcierre; ?>
Analisis
<?php //* Palabras iniciales $palabras = ["sol", "luna", "cielo", "luz", "estrellas", "lluvia"]; // *Verificar respuesta usuario for ($i = 0; $i < count($palabras); $i++) { if ($_REQUEST["palabra" . $i] == $palabras[$i]) { echo "<br>Adivininaste 🎉 las respuesta es correcta<br>"; } else { echo "<br>Incorrecto 🥺, la palabra es {$palabras[$i]}<br>"; } } ?>