Ver Mensaje Individual
  #11 (permalink)  
Antiguo 15/05/2014, 09:51
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: PHP programación cantidad de aprobados

$_REQUEST es una variable que se usaba en versiones anteriores de php, actualmente esta por compatibilidad y otros temas menores, su uso es en la practica reemplazado por el de $_POST y $_GET

Ahora, vamos por partes que tu codigo tiene muchos errores:
Código HTML:
Ver original
  1. <form method="post" action="recepcion.php"><!-- En minusculas, no cambia nada, pero es mas prolijo;) -->
  2.             <table border =1><tr>
  3.             <td>Nombre</td><td> <input type="text" name="nombres[]"></td><!-- Vas a cargar varios, por lo que todos deben tener el mismo nombre, y como es un conjunto de valores, no uno solo, se le agregan los corchetes, que indican que es un array -->
  4.             <td> Nota </td> <td> <input type="text" name="calificaciones[]" size="5"> </td><!-- Idem del anterior -->
  5.             </tr>
  6. <--
  7. A partir de aca, puedes agregar todas las filas que quieras, sean 2, 5, 20, 100 o N, las que quieras, el algoritmo funcionara para cualquier cantidad que agregues. puedes usar si quieres tu for  para meter la cantidad que quieras, da lo mismo.
  8. NOTA: si usas el for, el tr de arriba no va ya que el for los genera a todos iguales, es medio obvio, pero lo aclaro por las dudas.
  9. -->
  10.             <tr>
  11.                 <td>Nombre</td><td> <input type="text" name="nombres[]"></td> <!-- fijate que uso ciempre el mismo name -->
  12.             <td> Nota </td> <td> <input type="text" name="calificaciones[]" size="5"> </td><!-- y aca tambien, siempre los mismos dos names -->
  13.             </tr>
  14.             <tr>
  15.                 <td>Nombre</td><td> <input type="text" name="nombres[]"></td>
  16.             <td> Nota </td> <td> <input type="text" name="calificaciones[]" size="5"> </td>
  17.             </tr>
  18.             </table>
  19.             <input type="submit" value="enviar">
  20. </form> <!-- esto quizas lo recortaste accidentalmente, pero de bede ir -->

Paso a explicar, el atributo name es unico y lleva al nombre con el que identificaras el campo en php, pero en este caso (y muchos otros) tu no tienes un nombre, sino varios, y tu no tienes una nota, sino varias entonces lo que tienes es un arreglo de nombres y un arreglo de notas, los arreglos comparten un mismo nombre y difieren en su indice.

Similar a la sintaxis de php (aunque no tienen nada que ver unos con otros, ojo!) usar name="nombres[]" lo que hace es agregar un elemento al array nombres incrementando su indice, ¿Que significa? bueno, significa, a efectos practicos, que estas dos expreciones son equivalentes:

Código HTML:
Ver original
  1. <!--esto-->
  2. <input type="text" name="nombres[]">
  3. <input type="text" name="nombres[]">
  4. <input type="text" name="nombres[]">
  5.  
  6. <!-- es lo mismo que esto -->
  7. <input type="text" name="nombres[0]">
  8. <input type="text" name="nombres[1]">
  9. <input type="text" name="nombres[2]">

¿Se entiende la idea? usando la primer forma podemos repetir el codigo tantas veces como queramos y el navegador solo armara los indices, si lo hacemos de la segunda forma, nosotros tenemos que definir los indices explicitamente.
(No considero importante profundizar mas, si tienes dudas o no se entiende, preguntas)

Ahora bien, te dije al principio que $_REQUEST es un poco viejita y que hay variables "nuevas" para esto, (nuevas va entre comillas, porque hace mucho que estan disponibles, son mas recientes que $_REQUEST, nada mas)

Ahora, bien ¿cuales son, y como las usamos? tu formulario lo envias por POST asi que la variable a usar es la superglobal $_POST
Código PHP:
Ver original
  1. // Cambie algunos nombres de variables para que sea mas claro, nada mas.
  2.  
  3. $calificaciones = $_POST["calificaciones"]; // Esto lo hago solo con fines didacticos, en la practica puedes trabajar directamente con la superglobal, no necesitas copiar su contanido a otra variable, es una "mala practica" por llamarlo de alguna manera.
  4. $nombres = $_POST["nombres"]; // Idem anterior.
  5.  
  6. // Ahora, si te fijas, $calificaciones y $nombres no son valores fijos, sino que son arrays:
  7. var_dump($nombres);
  8. var_dump($calificaciones);
  9.  
  10. // Haces el calculo:
  11.  
  12. $resumen_notas = array("aplazados"=>array(), "desaprobados" => array(), "aprobados"=>array());
  13. foreach($calificaciones as $nro => $nota)
  14. {
  15.      if($nota >= 7)
  16.         $resumen_notas["aprobados"][] = $nombres[$nro];
  17.      elseif($nota >= 4)
  18.      //...
  19.      else
  20.      //...
  21. }
  22.  
  23. //Y ahora solo mostras la info:
  24. echo ("Aprobados (".count($resumen_notas["aprobados"]).") : ".(implode(", ", $resumen_notas["aprobados"])."<br>");
  25. // Idem para los otros 2.

en la parte de mostar podes hacer una tabla o lo que se te ocurra, yo lo puse asi para simplificar
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 15/05/2014 a las 10:04