Un ejercicio en PHP. Instrucciones:

  1. Crear un ordenador de numeros que pida al usuario cuantos numeros introducira.
  2. Crear dinamicamente el numero de campos necesarios para el numero de valores que el usuario ha defindo.
  3. Crear dos URLs con estos datos para enviarlos a procesar: uno para ordenamiento de menor a mayor y el otro para ordenamiento de mayor a menor
  4. Imprimir el resultado intercalando los numeros usando colores al estilo tabla de una columna.

Primeramente necesitamos un formulario HTML para pedir al usuario el numero de valores que desea ordenar. He aqui el codigo sencillo:

HTML:
  1. <br /> PHP Example by El Limbo de la Blogosfera<br />
  2. <form class="centrado" action="pag2.php" method="get"> <label for="numDatos">¿Cuantos datos desea introducir?</label>
  3. <input name="numDatos" type="text" /> <input type="submit" value="Enviar ahora!" /> </form>

Como pueden observar, el codigo HTML solo generará un formulario con un solo campo de texto, donde el usuario introducirá el numero de valores que desea ordenar. No hay mucha ciencia aqui. Basico.
Posteriormente se creará el codigo PHP necesario para procesar la informacion: generar el codigo HTML necesario para un formulario con el numero de campos de texto que el usuario solicito:

PHP:
  1. &lt;? php
  2. function imprimirFields($num){
  3. for($i=0; $i&lt;$num; $i++){
  4. echo "<label>Dato ".($i+1)."
  5. <input name="\&quot;numeros[]\&quot;" type="\&quot;text\&quot;" />";
  6. }
  7. }
  8. ?&gt;
  9.  
  10. &lt;br /&gt; PHP Example by El Limbo de la Blogosfera&lt;br /&gt;
  11. </label>
  12. <em>Introduce los datos en los campos destinados para ello.</em>
  13.  
  14. <form action="pag3.php" method="post">
  15. <blockquote>
  16.  
  17. <input type="submit" value="Enviar ahora!" /></blockquote>
  18. </form>

En este caso se creó una función que imprimirá el numero de campos solicitado.
La funcion imprimirFields recibe como parametro el numero que el usario ha definido. Con este valor inciamos un bucle for que tendra como limite el valor que el usuario introdujó menos uno, recordemos que el bucle empieza en cero, por lo tanto para compenzar esto es necesario restar uno al valor que el usuario dió quedando de esta manera: $i<=$num-1 si usamos el 'sea menor o igual a' (' <= ') o como en el codigo de ejemplo si usan el 'menor que' que al ser igual que el numero, automaticante se detiene. Si han manejado C/C++ o JavaScript entenderan esto sin problemas. En el echo imprime el campo input que tiene que nombre 'numeros', pero al tener los corchetes finales, se convierte en un array, o sea, todos lo valores se guardaran en el array 'numeros' haciendo mas facil su manipulacion. El codigo html genera lo necesario para el formulario y se le agrega la funcion en php que imprimira los campos, a esta funcion le pasamos el valor que el usuario dio a traves del metodo get, que fue el que se uso para enviarlo. Se obtiene por medio de la variable global $_GET.

Ahora solo queda enviarlo al tercer proceso cuyo codigo seria el siguiente:

PHP:
  1. &lt;? php
  2. function imprimirURL($array){
  3.  
  4. for($i=0; $i&lt;(count($array)); $i++){
  5. echo "&amp;".$i."=".$array[$i];
  6. }
  7. }
  8. ?&gt;
  9.  
  10. &lt;br /&gt; PHP Example by El Limbo de la Blogosfera&lt;br /&gt;
  11. <h3>Elija un tipo de ordenacion:</h3>
  12. <ul>
  13.     <li>
  14. <p class="centrado"><a href="pag4.php?operacion=1&amp;num=&lt;?php echo count($_POST['numeros']); imprimirURL($_POST['numeros']); ?&gt;">Ordenar de Menor a Mayor</a></p>
  15. </li>
  16.     <li>
  17. <p class="centrado"><a href="pag4.php?operacion=2&amp;num=&lt;?php echo count($_POST['numeros']); imprimirURL($_POST['numeros']); ?&gt;">Ordenar de Mayor a Menor</a></p>
  18. </li>
  19. </ul>

Aqui necesitamos procesar la informacion para generar URLs para el siguiente proceso. Se necesitan crear dos URLs: una para realizar el ordenamiento de menor a mayor, y la otra para realizar el proceso inverso. En este caso se genero una funcion que rellenaria las URLs, pero hay que tomar en cuenta dos cosas:

  • Se necesita discernir el tipo de operacion, pero como la funcion es generica, no podemos realizar eso en ella, por lo tanto, la declaracion del tipo de operacion se hara por separado.
  • Se necesita pasar el numero de elementos para poder realizar de una manera mas sencilla la operacion, pero como se 'desconocen' la funcion no puede albergar este dato...

Pasemos a la funcion. La funcion imprimirURL() recibe como parametro un array, para generar la url necesitamos poner los valores en la url, la manera mas eficiente es mediante un ciclo for, en este caso, el valor limite es el tamaño del array (cuantos items posee) el cual lo obtenemos por medio de la funcion COUNT(). Pasamos a generar la URL mediante echo, como los valores se iran insertando conforme el bucle avanza, la linea queda:

PHP:
  1. echo "&amp;".$i."=".$array[$i];

donde '&' es el concatenador para los valores en la url, a este se le concatene (por medio del punto en php) el valor que en ese momento tenga la variable $i, a su vez concatenada al simbolo '=' para significar el valor de esa variable que es la siguiente obtenida por medio de $array[$i]. Esto produciria en el ciclo lo siguinte, si los valores en el array sean 5-4-3-2-1 por ejemplo:

HTML:
  1. &amp;0=5&amp;1=4&amp;2=3&amp;3=2&amp;4=1

Si bien esto es confuso, siginifica lo sigiente: la variable 0 vale 5, la variable 1 vale 4 y asi sucesivamente. Esto obviamente no general una URL propiamente dicha, pero es el primer paso. Sigue la culminacion con el codigo HTML, esto lo tenemos en las siguientes lineas:

HTML:
  1.     <li>
  2. <p class="centrado"><a href="pag4.php?operacion=1&amp;num=&lt;?php echo count($_POST['numeros']); imprimirURL($_POST['numeros']); ?&gt;">Ordenar de Menor a Mayor</a></p>
  3. </li>
  4.     <li>
  5. <p class="centrado"><a href="pag4.php?operacion=2&amp;num=&lt;?php echo count($_POST['numeros']); imprimirURL($_POST['numeros']); ?&gt;">Ordenar de Mayor a Menor</a></p>
  6. </li>
  7. </ul>

donde en la url estamos haciendo referencia al archivo 'pag4.php' a la cual le pasamos los valores por medio del signo de interrogracion (' ? '). En este caso definimos la variable operaciones con valor 1 y en la segunda url con valor 2, esto significa: si es 1, entonces es de menor a mayor, si es dos, es a la inversa. Tambien definimos la variable num que contendra el tamaño del array, que en seguida imprimos con php y la funcion COUNT(). En seguida va la implementacion de la funcion para terminar de generar la url, quedando asi (usando los mismos valores del ejemplo anterior):

HTML:
  1. <!--- primera url  -->
  2. <a href="pag4.php?operacion=1&amp;num=5&amp;0=5&amp;1=4&amp;2=3&amp;3=2&amp;4=1">Ordenar de Menor a Mayor</a>
  3. <!--- segunda url  -->
  4. <a href="pag4.php?operacion=2&amp;num=5&amp;0=5&amp;1=4&amp;2=3&amp;3=2&amp;4=1">Ordenar de Mayor a Menor</a>

Con esto tenemos la url generada y la informacion lista para el ultimo proceso, pagina cuyo codigo es el siguiente:

PHP:
  1. &lt;br /&gt; PHP Example by El Limbo de la Blogosfera&lt;br /&gt;
  2. if($_REQUEST['operacion'] == 1){
  3. for($i=0; $i&lt;$_REQUEST['num']; $i++){
  4. $array[$i]=$_REQUEST[$i];
  5. }
  6. sort($array);
  7. <h1>Ordenados de Menor a Mayor</h1>
  8. ";
  9. <h4>Numero de Elementos: ".$_REQUEST['num']."</h4>
  10. ";
  11. for($i=0; $i&lt;$_REQUEST['num']; $i++){
  12. <p class="\&quot;azul\&quot;">".$array[$i]."</p>
  13. ";
  14. $i++;
  15. if($i &lt;$_REQUEST['num']){
  16. <p class="\&quot;verde\&quot;">".$array[$i]."</p>
  17. ";
  18. }
  19. }
  20. }
  21. else if($_REQUEST['operacion'] == 2){
  22. for($i=0; $i&lt;$_REQUEST['num']; $i++){
  23. $array[$i]=$_REQUEST[$i];
  24. }
  25. rsort($array);
  26. <h1>Ordenados de Mayor a Menor</h1>
  27. ";
  28. <h4>Numero de Elementos: ".$_REQUEST['num']."</h4>
  29. ";
  30. for($i=0; $i&lt;$_REQUEST['num']; $i++){
  31. <p class="\&quot;azul\&quot;">".$array[$i]."</p>
  32. ";
  33. $i++;
  34. if($i &lt;$_REQUEST['num']){
  35. <p class="\&quot;verde\&quot;">".$array[$i]."</p>
  36. ";
  37. }
  38. }
  39. }
  40. ?&gt;

En este ultimo paso recibimos la informacion por medio de la variable global $_REQUEST. Ahi por medio de su identificador obtenemos los valores, con un condicional if realizaremos una u otra operacion. Para ello hacemos uso de la funcion SORT() y su contraparte RSORT(). La primera ordena los valores de un array por orden ascendente, y la segunda por orden descendente. Pero para ello necesitamos volcar las variables que contienen los numeros del array $_REQUEST a otro array que los contendra de manera exclusiva, esto debido a que en el array $_REQUEST no solo contiene los numeros que introdujo el usuario, sino tambien el indicador de que tipo de operacion realizar y el numero de items del array, en pocas palabras, el array esta 'contaminado' como para aplicarle la funcion SORT()/RSORT() directamente. Para volcar las variables haremos uso de un bucle for, teniendo como limite el numero de items del array que enviamos a traves de la variable 'num'. Para hacer mas facil la identificacion de las variables que contienen los numeros, si se dieron cuenta, usamos una pequeña trampa: llamarles segun el valor que la variable $i tenia en ese periodo del bucle. Asi nos quedaron como identificadores los numeros 0,1,2,3,4,5... etc
Esto nos permite que para llamarlos de la variable $_REQUEST sea unicamente necesario utilizar en el bucle $_REQUEST[$i]. Ven que facil? ;)
El bucle es este:

PHP:
  1. for($i=0; $i&lt;$_REQUEST['num']; $i++){
  2. $array[$i]=$_REQUEST[$i];
  3. }

Posteriormente, ya al tener un array 'puro', aplicamos la funcion SORT() o RSORT() segun sea el caso. Finalmente imprimimos el array con un bucle. Pero como necesitamos colorearlos de manera intermitente, aplicaremos un if dentro del bucle para poder imprimir dos valores por cada ciclo. Esto para determinar de manera exacta el fin del array, porque si el array es impar, imprimiria un valor nulo. Para colorearlo simplemente usamos CSS: las clases 'azul' y verde'. El codigo especifico es el siguiente:

PHP:
  1. for($i=0; $i&lt;$_REQUEST['num']; $i++){
  2. <p class="\&quot;azul\&quot;">".$array[$i]."</p>
  3. ";
  4. $i++;
  5. if($i &lt;$_REQUEST['num']){
  6. <p class="\&quot;verde\&quot;">".$array[$i]."</p>
  7. ";
  8. }
  9. }

Como pueden ver, en el ciclo imprimimos un valor con la clase azul, posteriormente incrementamos el valor del indice $i y con un if revisamos que $i aun sea menor que el numero maximo, obtenido desde $_REQUEST. Si es asi, continua imprimiendo el valor pero ahora con la clase verde. Y esto es sucesivo hasta que la condicion señalada en el for se cumpla, o la señalada en el if dentro del for. Practicamente esto es todo. El codigo CSS para colorear las clases es el siguiente:

CSS:
  1. .azul{
  2. color: black;
  3. font-size: 15px;
  4. font-weight: bold;
  5. background: #00FFFF;
  6. text-align: center;
  7. width: 100px;
  8. height: 10px;
  9. margin: 10px;
  10. margin-left: auto;
  11. margin-right: auto;
  12. }
  13. .verde{
  14. color: white;
  15. font-size: 15px;
  16. font-weight: bold;
  17. background: #00FF7F;
  18. text-align: center;
  19. width: 100px;
  20. height: 10px;
  21. margin: 10px;
  22. margin-left: auto;
  23. margin-right: auto;
  24. }

NOTA: La representacion CSS puede variar entre diferentes navegadores. Este codigo fue testeado unicamente en el navegador Opera, version 9.2+.

Pueden ver el scrip completo en funcionamiento por aqui.
Dudas, comentarios y cualquier otra cosa deja un mensaje ;)

Ciao!

----------------
Now playing: Panic! At The Disco - The Only Difference Between Martyrdom And Suicide Is Press Coverage
via FoxyTunes