UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN CICLO: 01/2014 Nombre de la Practica: Lugar de Ejecución: Tiempo Estimado: MATERIA: DOCENTES: GUIA DE LABORATORIO #3 Matrices y funciones en PHP Centro de Cómputo 2 horas con 30 minutos Lenguajes Interpretados en el Servidor Mg. Blanca Iris Cañas Abarca, Ing. Ricardo Ernesto Elías Guandique I. OBJETIVOS Que el estudiante: Desarrolle la capacidad de utilizar eficazmente matrices para almacenar valores y acceder a sus valores en los scripts PHP. Sea capaz de utilizar estructuras de control repetitivas para trabajar con datos procedentes de una matriz escalar o asociativa. Adquiera el dominio de matrices unidimensionales y multidimensionales utilizando ciclos o lazos repetitivos anidados. Haga uso de diversas funciones para manejo de matrices con PHP. Adquirir el dominio de la sintaxis y el uso de funciones con PHP. Lograr la habilidad necesaria para la declaración de funciones con o sin argumentos y con devolución o no de valores. Hacer uso de características avanzadas de las funciones como la lista variable de argumentos, las funciones variables y recursividad. Hacer uso de la modularidad para crear scripts que serán incluidos dentro de un script principal. II. INTRODUCCION TEORICA Matrices en PHP Una matriz o arreglo es un tipo de dato compuesto que permite almacenar bajo un mismo nombre un conjunto de valores que pueden ser de tipos de datos diferentes. Cuando se define una matriz se hace de forma similar a las variables escalares con la diferencia de que la asignación de valores se debe realizar a cada una de las posiciones del arreglo. También se puede utilizar en lugar de la asignación directa estructuras de control como ciclos repetitivos o funciones para asignar varias posiciones de una vez, como veremos más adelante. 1 / 59 Guía # 3: Matrices y funciones en PHP Clasificación de las matrices En PHP se pueden clasificar las matrices de dos formas: a) Por el tipo de índice que utilizan. Este índice se utiliza para hacer referencia a un elemento específico del arreglo– y, b) Por el número de dimensiones de la matriz. Esto es, cuántos índices son necesarios para hacer referencia a un elemento específico. Tipos de matrices según el tipo de índice: a) Matrices escalares También se les conoce como matrices enumeradas o indexadas, por el hecho que utilizan números enteros como índices. En PHP el índice para el primer elemento de un arreglo empieza en cero y los siguientes elementos van aumentando en uno este valor de índice, de modo que el segundo elemento tiene índice uno, el tercero índice dos, etc. Por ejemplo, se puede tener una matriz llamada $numeros con cinco elementos. Para asignar un valor a cada uno de los elementos de este arreglo, habría que escribir: $numeros[0] = 1; $numeros[1] = 2; $numeros[2] = 3; $numeros[3] = 4; $numeros[4] = 5; Luego, si deseamos mandar a imprimir el tercer elemento de este arreglo, tendríamos que escribir: echo $numero[2]; Ahora bien, si lo que deseamos es imprimir todos los elementos de la matriz, la mejor solución sería utilizar una sentencia repetitiva como esta: for($i=0; $i<count($numeros); $i++){ echo $numeros[$i] . "<br />\n"; } b) Matrices asociativas Estas matrices también son conocidas como tablas hash. Se caracterizan por utilizar una cadena de caracteres como índice de la matriz. Lo normal es utilizar una cadena que permita asociar fácilmente el índice con el valor que almacena el elemento. Por ejemplo, se puede crear una matriz llamada $monedas con cuatro elementos y asociar valores a cada uno de estos elementos de la siguiente forma: $monedas["El Salvador"] = "dólar"; $monedas["Guatemala"] = "quetzal"; $monedas["Costa Rica"] = "colón"; $monedas["Honduras"] = "lempira"; Si deseamos mandar a imprimir los valores de este arreglo, deberíamos escribir: echo $monedas["El Salvador"]; echo $monedas["Guatemala"]; echo $monedas["Costa Rica"]; echo $monedas["Honduras"]; Lenguajes Interpretados en el Servidor 2 Guía # 3: Matrices y funciones en PHP O, haciendo uso de estructuras de control repetitivas, con la sentencia foreach: foreach($monedas as $key => $value){ echo "Moneda de " . $key . ": " . $value . "<br />\n"; } Tipos de matrices según el número de dimensiones: a) Matrices unidimensionales Es una matriz que utiliza un único índice para hacer referencia a todos los elementos de la misma. Este índice puede ser escalar o asociativo. b) Matrices multidimensionales Es una matriz que necesita utilizar más de un índice para hacer referencia a un elemento específico. De todas las matrices multidimensionales, las más utilizados son las de dos dimensiones. Los arreglos de tres o más dimensiones no se utilizan tanto debido a que son más difíciles de comprender y manejar. El siguiente bloque de código muestra la definición de un arreglo multidimensional (con índices asociativos) y luego manda a imprimir en la ventana del navegador uno de sus elementos: <? $pais=array ( "espana" =>array ( "nombre"=>"España", "lengua"=>"Castellano", "moneda"=>"Peseta" ), "francia" =>array ( "nombre"=>"Francia", "lengua"=>"Francés", "moneda"=>"Franco" ) ); echo $pais["espana"]["moneda"]; //Imprime en la ventana del navegador: "Peseta" ?> Creación de matrices en PHP En PHP, las matrices o arreglos se pueden crear asignando los valores a los elementos directamente, tal y como se ha hecho en los ejemplos anteriores, o se pueden utilizar funciones para ese propósito. Las funciones que permiten crear arreglos en PHP son: array() y range(). La sintaxis de cada una de ellas se muestra a continuación: $arreglo = array($valor1, $valor2, … , $valorn); $matriz = range($valorinicial, $valorfinal, $desplazamiento); La función array() se utiliza para crear una variable de tipo matriz y asignarle los valores que va a contener en una sola instrucción. En tanto que, con range() se puede crear una matriz que comienza desde el $valorinicial y termina con el $valorfinal. Asignar los elementos de una matriz a variables escalares PHP proporciona una función que permite asignar en una sola instrucción los elementos de una matriz a variables escalares independientes. Esta función es list(), que posee como argumentos las variables escalares en donde se almacenarán los valores almacenados en las posiciones del arreglo de forma ordenada. La sintaxis de la función es la que se muestra a continuación: list ($variable1, $variable2, … , $variablen) = $mi_array Lenguajes Interpretados en el Servidor 3 Guía # 3: Matrices y funciones en PHP Donde, $mi_array, es la matriz o arreglo del que se extraerán los elementos. $variable1, $variable2, … , $variablen, son las variables escalares independientes en las que se asignarán los diferentes elementos de la matriz. Funciones importantes para trabajar con matrices El lenguaje PHP, brinda una cantidad considerable de funciones para facilitar el trabajo con matrices. A continuación se brinda información detallada de varias de ellas: Funciones para recorrer una matriz Cuando se trabaja con matrices, PHP ofrece una serie de funciones que permiten realizar de forma más fácil y conveniente esta tarea. count(): Permite obtener el número de elementos que componen la matriz. Es muy útil cuando se pretende realizar un recorrido sobre una matriz utilizando ciclos for, while o do-while. Por ejemplo: for($i=0; $i<count($matriz); $i++) sizeof(): También se utilize para obtener el número de elementos de una matriz. Por ejemplo: for($i=0; $i<sizeof($matriz); $i++) next(): Devuelve el valor del elemento siguiente al actual (si existe), avanzando el puntero interno una posición. En caso de que el elemento actual sea el último de la matriz, devuelve false. prev(): Devuelve el valor del elemento anterior al actual (si existe), retrocediendo el puntero interno una posición. En caso de que el elemento actual sea el primero, devuelve false. current(): Devuelve el valor del elemento situado en la posición actual del cursor. Si la matriz está vacía o no hay más elementos, la función devolverá false. key(): Devuelve el índice del elemento situado en la posición actual del cursor. Si la matriz está vacía, o no hay más elementos, devuelve la constante NULL. reset(): Sitúa el cursor interno de la matriz en el primer elemento de la misma y devuelve el valor de dicho elemento. Si la matriz está vacía, la función devuelve el valor false. end(): Avanza el cursor interno de la matriz hasta el último elemento de la misma y devuelve el valor de dicho elemento. Si la matriz está vacía devuelve false. each(): Se usa para recorrer matrices (especialmente matrices asociativas), devolviendo simultáneamente el índice y el valor asociado al índice actual de un elemento. Además, avanza el puntero interno de la matriz hacia el siguiente elemento. Si el puntero interno apunta a la última posición de la matriz, la función devuelve false. list(): Asigna una lista de variables en una sola operación. Suele utilizarse en combinación con la función each(). OBSERVACIÓN: El argumento de todas las funciones anteriores es una matriz. A excepción de la función list(). Ejemplo: $matriz = array("Primavera", "Verano", "Otoño", "Invierno"); do{ Lenguajes Interpretados en el Servidor 4 Guía # 3: Matrices y funciones en PHP $index = key($matriz); $value = current($matriz); echo $index . ": " . $value . "<br>\n"; }while(next($matriz)); foreach PHP4 y PHP5 incluyen la instrucción foreach, tal como Perl y algunos otros lenguajes. Esta instrucción permite recorrer los elementos de una matriz de una forma sencilla. La instrucción permite obtener cada uno de los valores almacenados en el arreglo y asignarlos automáticamente en una variable para trabajar con ellos dentro del bloque de instrucciones del foreach. También es posible obtener el índice si acaso, se ha utilizado un matriz asociativa. Hay dos sintaxis; la segunda es una extensión menor, pero útil de la primera: foreach(expresion_array as $value) //sentencias; foreach(expresion_array as $key => $value) //sentencias; La primera forma recorre el array dado por expresion_array. En cada iteración, el valor del elemento actual se asigna a $value y el puntero interno del array se avanza en una unidad (así en la siguiente iteración, se estará apuntando de forma automática el elemento siguiente). La segunda manera hace lo mismo, salvo que la clave del elemento actual será asignada a la variable $key en cada iteración. Notas: Cuando foreach comienza su primera ejecución, el puntero interno a la lista (array) se reinicia automáticamente al primer elemento del array. Esto significa que no se necesita llamar a reset() antes de un bucle foreach. Hay que tener en cuanta que foreach trabaja con una copia de la lista (array) especificada y no la lista en si, por ello el puntero de la lista no es modificado como en la construcción each. Algunos ejemplos más para demostrar su uso: <?php /* foreach ejemplo 1: sólo valor*/ $a = array(1, 2, 3, 17); foreach($a as $v) { print "Valor actual de \$a: $v.\n"; } /* foreach ejemplo 2: valor (con clave impresa para ilustrar) */ $a = array(1, 2, 3, 17); $i = 0; /* sólo para propósitos demostrativos */ foreach($a as $v) { print "\$a[$i] => $v.\n"; $i++; } /* foreach ejemplo 3: $a = array( "uno" => 1, "dos" => 2, "tres" => 3, "diecisiete" => 17 ); clave y valor */ Lenguajes Interpretados en el Servidor 5 Guía # 3: Matrices y funciones en PHP foreach($a as $k => $v) { print "\$a[$k] => $v.\n"; } /* foreach ejemplo 4: matriz multi-dimensional */ $a[0][0] $a[0][1] $a[1][0] $a[1][1] = = = = "a"; "b"; "y"; "z"; foreach($a as $v1) { foreach ($v1 as $v2) { print "$v2\n"; } } /* foreach ejemplo 5: matriz dinámica */ foreach(array(1, 2, 3, 4, 5) as $v) { print "$v\n"; } ?> Funciones Una función es un bloque de código independiente y autónomo que contiene un grupo de instrucciones que se identifican con un nombre. Las funciones pueden invocarse todas las veces que se requiera desde cualquier punto de un script. El código de las funciones puede aparecer dentro del script que se esté realizando o puede ser parte de un script independiente que será llamado como archivo de inclusión (otro script PHP invocado). Generalmente, cuando se realizan scripts con PHP las instrucciones se ejecutan conforme van siendo procesadas por el intérprete del lenguaje. Sin embargo, a la hora de realizar scripts más complejos, hay ocasiones en las que el mismo código ha de ser ejecutado más de una vez. Para estos casos sería útil que el lenguaje de programación permitiera dividir el código en segmentos más pequeños, de forma que cada bloque de código PHP pudiera ser agrupado bajo un identificador para que pudiera ser accedido de forma independiente. PHP permite la creación de funciones que permiten recoger todos los aspectos planteados anteriormente. Una función permite desarrollar una tarea concreta y bien definida. Se encuentra separada del resto de instrucciones del programa y se le asigna un nombre para que posteriormente pueda ser llamada desde otro punto del script, o incluso, desde otro script. Es a través del nombre de la función que se pueden ejecutar las instrucciones contenidas en la función tantas veces como sea necesario. La utilización de funciones permite que un script aparezca escrito como una lista de referencias a las tareas que se deben hacer para crear una página de respuesta. Las funciones también pueden o no, aceptar parámetros o argumentos externos de los que dependa el proceso que deba realizarse para posteriormente devolver un valor. Sintaxis de las funciones en PHP En su forma más compleja una función se declara con la palabra reservada function. A continuación, se debe declarar el nombre de la función y posteriormente, y entre paréntesis, cada uno de los argumentos que recibirá separados por coma. En el caso más simple, sólo se colocan los paréntesis vacíos inmediatamente después del nombre de la función. Después de cerrar los paréntesis debe abrir llaves y colocar las instrucciones que realizará la función para luego cerrar la llave. La sintaxis se muestra a continuación: function nombre_funcion([$param1, $param2, … , $paramn]){ //bloque de instrucciones PHP } Lenguajes Interpretados en el Servidor 6 Guía # 3: Matrices y funciones en PHP Como se puede ver, son necesarios los siguientes componentes en la declaración de una función: La palabra reservada function que debe utilizarse para indicar al intérprete de PHP que se va a crear una nueva función nombre_funcion indica el nombre con el que se va a identificar la función dentro del script PHP para su posterior llamada. $param1, $param2, ... , $paramn representan los parámetros necesarios para que la función pueda ser ejecutada. Los parámetros han de expresarse siempre entre paréntesis y separados por comas. Incluso si la función no necesitara ningún parámetro, deberán utilizarse los paréntesis. Bloque de instrucciones PHP, representa el conjunto de sentencias o instrucciones que se van a ejecutar cada vez que se haga una llamada a la función. Argumentos o parámetros de la función El diseño de una función puede o debería incluir la aceptación opcional de uno o más argumentos o parámetros que representarán valores que se pasan desde el exterior a la función. Esto permite que la función sea independiente del exterior, haciéndola más portable. Se puede entender un argumento o parámetro como una variable con ámbito local a la función que sirve para almacenar valores que son pasados a la función. Los argumentos o parámetros se especifican colocando nombres de variables entre los paréntesis de la definición de la función: function myfunction($parametro1, $parametro2){ //Código de la función } Devolución de valores Casi siempre será importante que la función creada devuelva un valor antes de finalizar la ejecución. Aunque también existirán casos en los que la función pudiera realizar una tarea sin que devuelva valor alguno. La palabra reservada utilizada para devolver valores en las funciones de PHP es return, igual que en otros lenguajes que usted ya conoce. Veamos los siguientes ejemplos: function square ($num) { return $num * $num; } echo square(4); // obtiene ’16’. ------------------------------------------function residuo($dividendo, $divisor){ $res = $dividendo % $divisor; return $res; } No se puede devolver múltiples valores desde una función, pero un efecto similar se puede conseguir devolviendo una lista. function small_numbers(){ return array(0, 1, 2); } list($zero, $one, $two) = small_numbers(); Apunte importante: Recuerde que a los valores que se le aportan a una función desde el exterior se les denomina parámetros o argumentos de la función. Los parámetros actúan como variables dentro de la función. Estas variables no pueden utilizarse fuera de ese ámbito. El valor que devuelva la función debe ser enviado utilizando la palabra reservada return y a continuación el nombre de la variable que contiene el resultado. Lenguajes Interpretados en el Servidor 7 Guía # 3: Matrices y funciones en PHP Ventajas del uso de funciones a) Simplificación de código Las funciones hacen que el código de un script sea más fácil de leer, por tanto, lo hacen más entendible y más agradable a la vista del que tenga que leer el código. Esto es, porque evita el tener que repetir varias veces un segmento de código dentro de un mismo script. En lugar de ello se escribe una sola vez y luego dentro del script solamente hacemos la llamada a la función, en lugar de volverlo a escribir. b) Reutilización de código Permite que otros scripts, a parte del script donde se digitó el código de la función, puedan hacer uso de dicha función. Esto evita la carga del programador de tener que escribir la misma funcionalidad en diferentes scripts. c) Modularidad El uso de funciones permite que las modificaciones al código sean menos trabajosas para el programador, porque en lugar de tener que cambiar el mismo código en varios lugares de un script, solamente se modifica el código de la función y los scripts que la llaman no sufren modificación alguna (al menos, en la mayor parte de los casos). Funcionamiento de una función en PHP Aunque el comportamiento puede variar en algunos casos, la mayoría de las funciones siguen un proceso como el siguiente, una vez que son invocadas: 1. Aceptan uno, o más, valores, conocidos como argumentos, desde el script que la llama, 2. Realizan un proceso utilizando dichos valores (argumentos o parámetros), y 3. Devuelven el resultado y el control del programa al script que hizo la llamada. Código de una función en Visual Basic Características de las funciones de PHP (versión 4.2.X en adelante) 1. PHP no hace distinción entre mayúsculas y minúsculas para los nombres de las funciones. Pese a ello se recomienda ser consistente en el código que se escribe de tal forma que si se nombró a una función Cambiar, utilizar en el código siempre Cambiar, y no, cambiar, CAMBIAR, CAMbiar, etc. 2. Al igual que con las variables, podemos hacer referencia (una llamada) a una función antes de definirla en el código. Existe una excepción, que se da cuando la función ha sido definida condicionalmente. En ese caso la definición debe preceder a la llamada. 3. No se puede redefinir una función o eliminar su definición. Esto se debe a que PHP no soporta sobrecarga de funciones como otros lenguajes de programación. Por ejemplo C++. 4. Las últimas versiones de PHP, (4 o superior) soportan el uso de lista variable de argumentos en las Lenguajes Interpretados en el Servidor 8 Guía # 3: Matrices y funciones en PHP 5. funciones. Se pueden utilizar parámetros por defecto en las funciones asignándole un valor inicial dentro de la definición de los parámetros de la función. Tipos de funciones. En PHP podemos utilizar las funciones incorporadas del lenguaje (abs(), list(), array(), chr(), intval(), trim(), substr(), printf(), time(), date(), etc.) o pueden realizarse funciones definidas por el usuario. Las funciones incorporadas del lenguaje se comportan de la forma predeterminada para la que fueron creadas. Existen muchas funciones incorporadas o predefinidas en PHP. Algunas ya las hemos utilizado en guías anteriores. Por ejemplo: gettype(), settype(), print(), printf(), substr(), date(), etc. Las funciones definidas por el usuario, o personalizadas, son creadas por el programador y su funcionalidad y utilidad dependen en gran medida de la habilidad del programador. La ventaja de las segundas es que el programador posee un control completo sobre ellas, ya que puede hacer que una función se comporte exactamente del modo que se desea. Parámetros de las funciones La información puede suministrarse a las funciones mediante la lista de parámetros, una lista de variables y/o constantes separadas por comas. PHP soporta pasar parámetros por valor (el comportamiento por defecto), por referencia, y parámetros por defecto. Listas de longitud variable de parámetros sólo están soportadas en PHP4 y posteriores. Un efecto similar puede conseguirse en PHP3 pasando un array de parámetros a la función: function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } Pasar parámetros por referencia Por defecto, los parámetros de una función se pasan por valor (de manera que si se cambia el valor del argumento dentro de la función, el valor pasado fuera de ella no se ve alterado). Si se desea permitir a una función modificar el valor de sus parámetros, deben ser pasados por referencia. Para hacer que una función pase sus parámetros por referencia existen dos métodos: Anteponiendo un símbolo de ampersand (&) al nombre del parámetro o argumento en la definición de la función. Esto hará que siempre que se mande un parámetro a la función en la llamada, este será enviado por referencia. Por ejemplo: function add_some_extra(&$string){ $string .= ' y algo más.'; } $str = ’Esto es una cadena, ’; add_some_extra($str); echo $str; // Saca ’Esto es una cadena, y algo más.’ Anteponer el símbolo de ampersand (&) al nombre del parámetro en la llamada a la función. Este método se debe aplicar si se desea pasar una variable por referencia a una función que no toma el parámetro por referencia por defecto; es decir, si no se especificó en la definición de la función. $num = 10; function called_function($number){ //En la declaración no indica que //el parámetro sea por referencia $number = $number +1; echo $number, "\n"; } called_function(&$num); //Se le pasa el parámetro por //referencia a la función echo $num, "\n"; Parámetros por defecto Lenguajes Interpretados en el Servidor 9 Guía # 3: Matrices y funciones en PHP Una función puede definir valores por defecto para los parámetros escalares estilo C++. Esto significa que si al llamar a una función, que requiere parámetros, estos no se especifican, se le asignará a estos un valor por defecto. Veamos el siguiente ejemplo: function makecoffee($type = "cappucino"){ return "Hacer una taza de $type.\n"; } echo makecoffee(); //Se llama a la función sin indicar parámetro echo makecoffee("espresso"); //Se llama a la función usando parámetro La salida del fragmento anterior es: Hacer una taza de cappucino. Hacer una taza de expresso. El valor por defecto tiene que ser una valor literal, y no una variable o miembro de una clase. En PHP 4.0 también es posible especificar unset como parámetro por defecto. Esto significa que el argumento no tomará ningún valor en absoluto si el valor no es suministrado. Destacar que cuando se usan parámetros por defecto, estos tienen que estar a la derecha de cualquier parámetro sin valor por defecto; de otra manera las cosas no funcionarán de la forma esperada. Considera el siguiente fragmento de código: function makeyogurt ($type = "acidophilus", $flavour) { return "Haciendo un bol de $type $flavour.\n"; } echo makeyogurt ("mora"); // No funcionará de la manera esperada La salida del ejemplo anterior es: Warning: Missing argument 2 in call to makeyogurt() in usr/local/etc/httpd/htdocs/php3test/functest.html on line 41 Haciendo un bol de mora. Y ahora, compáralo con: function makeyogurt ($flavour, $type = "acidophilus") { return "Haciendo un bol de $type $flavour.\n"; } echo makeyogurt ("mora"); // funciona como se esperaba La salida de este ejemplo es: Haciendo un bol de acidophilus mora. Funciones variables En la mayoría de casos las llamadas a función se realizan con el identificador de la función de forma directa, sin embargo, en PHP es posible asignar el identificador a una variable de cadena y hacer que en la llamada a función se utilice esta variable en lugar del nombre o identificador de la función. Por ejemplo: $funcion = "potencia"; $valor = 3; echo "$valor elevado al cuadrado es: " . $funcion(3) . "<br />"; //Definición de la función sqrt function sqrt($numero){ return $numero * $numero; } Aunque este ejemplo es bastante trivial, el verdadero potencial de las funciones variables se puede experimentar al realizar retrollamadas (callbacks), definiendo una matriz (array) con los nombres de varias Lenguajes Interpretados en el Servidor 10 Guía # 3: Matrices y funciones en PHP funciones haciendo que un ciclo o lazo recorra los nombres de las funciones para que realice cada una el cálculo con uno o varios valores con las distintas funciones definidas. Por ejemplo: $trigFunctions = array("sin", "cos", "tan"); //Funciones predefinidas PHP $degrees = 30; foreach($trigFunctions as $myfunction){ echo "\$myfunction(\$degrees) = " . $myfunction(deg2rad($degrees)) . "<br />"; } Alcance La palabra alcance hace referencia a las partes del programa que pueden tener acceso a una variable. La vida de una variable es el tiempo durante el cual existe. En PHP las variables pueden tener tres tipos de alcance: a) Local. Las variables locales son visibles dentro de una función y su vida acaba justo cuando la ejecución de la función termina. Por defecto, todas las variables que se declaran dentro de una función son locales en la función. Esto significa que estas variables no son accesibles desde fuera de la función y mueren cuando la función termina. Ejemplo: <?php //Variable global, visible afuera de las funciones $friend = "Carlos"; function who(){ //Variable local que muere cuando acaba la función $friend = "Juan"; printf("<p>Dentro de la funci&oacute;n tu amigo es: %s.</p>", $friend); } //Llamada a la función who() who(); printf("<p>Fuera de la funci&oacute;n tu amigo es: %s.</p>", $friend); ?> Al ejecutar el script obtenemos lo siguiente: b) Global. Las variables globales son visibles en todo un script, y normalmente no lo son para una función. Dentro de una función no se puede acceder a las variables que se han declarado fuera de ella, a menos que la pasemos por referencia a la función en forma de argumento. Otra forma de hacer que una función acceda a una variable externa a la función es utilizando la palabra reservada global antes del nombre de la variable. Ejemplo: Usando argumento por referencia <!DOCTYPE html> <html lang="es"> <head> <title>Argumento a funci&oacute;n</title> </head> <body> <?php //function raise_sal(&$salary){ function raise_sal(&$salary){ //global $salary; $salary *= 1.1; } Lenguajes Interpretados en el Servidor 11 Guía # 3: Matrices y funciones en PHP $salary = 50000; //raise_sal(); raise_sal($salary); ?> &iexcl;Felicidades!, su nuevo salario es: . <?= "$" . $salary ?><br /> </body> </html> Al ejecutar el script obtenemos lo siguiente: Ejemplo <!DOCTYPE html> <html lang="es"> <head> <title>Argumento a funci&oacute;n</title> </head> <body> <?php function raise_sal(){ $GLOBALS['salary'] *= 1.1; } $salary = 50000; raise_sal(); ?> &iexcl;Felicidades!, su nuevo salario es: . <?= "$" . $salary ?><br /> </body> </html> El resultado es: c) Estático. Las variables estáticas son locales en una función, pero retienen su valor entre distintas llamadas a la misma. Una variable estática no es visible fuera de la función, pero no muere cuando la función acaba. Cuando se inicializa una variable estática, esta no pierde su valor entre las distintas llamadas, recuerda el valor que tenía en la llamada anterior. Estas variables mueren hasta que termina el script. Ejemplo: <?php function trackname(){ static $count = 0; $count++; echo "<p>Has ingresado a esta p&aacute;gina $count veces</p>"; } //Invocar varias veces a la función trackname() trackname(); trackname(); trackname(); trackname(); ?> El resultado es: Lenguajes Interpretados en el Servidor 12 Guía # 3: Matrices y funciones en PHP Funciones incorporadas de PHP PHP proporciona un gran número de funciones incorporadas, que ya están listas para su utilización inmediata. Lo único que debe hacerse es invocarlas, para lo que necesitará conocer su sintaxis, los argumentos que requiere en la llamada y el tipo de valor que devuelve para asignarlo a alguna variable u operar con el resultado. Entre los tipos de funciones más utilizados están: Funciones para manejo de caracteres. En PHP existen funciones que permiten trabajar con cadenas de caracteres que podemos dividir en varias subcategorías. Por ejemplo, funciones para limpiar espacios en blanco, como trim(), ltrim(), rtrim() o chop(), funciones para cambiar de mayúsculas a minúsculas y viceversa, como strtolower() y strtoupper(), funciones para obtener partes de una cadena o un indicador de posición de coincidencia de una subcadena dentro de otra cadena; es decir obtener subcadenas de una cadena más larga, como substr(), strpos(), strstr(), explode(), etc. Funciones de búsqueda, reemplazo y comparación en cadenas. Estas funciones permiten realizar búsqueda de una cadena dentro de otra más larga, reemplazar ciertos caracteres de una cadena por otros o comparar una cadena con otra, como htmlentities(), substr_replace(), str_ireplace(), strcmp(), strncmp(), strcasecmp(), etc. Funciones de fecha y hora. Estas funciones permiten trabajar con fechas en PHP, ya sea para obtener algo conocido como la marca de tiempo de la era UNIX o para mostrar datos específicos de una fecha y hora, como el día, el mes, el año, la hora, los minutos y hasta los segundos. Las funciones de fecha de PHP son, entre otras: time(), mktime(), date(), checkdate(), date_default_timezone_get(), date_default_timezone_set(), etc. Funciones para manejo de archivos y directorios. Otro conjunto de funciones útiles, en este caso para el manejo de archivos, son las funciones: fopen(), fread(), fwrite(), feof(), fgetc(), fgets(), fputs(), fseek(), rewind(), ftell(), fclose(), etc. Funciones para manejo de expresiones regulares. También existen algunas funciones de PHP relacionadas con el manejo de expresiones regulares. Entre estas se pueden mencionar: preg_match(), preg_match_all(), preg_replace(), preg_split(), etc. Funciones para trabajo con bases de datos. Las funciones para trabajar con bases de datos en PHP son diversas, dependiendo del tipo de gestor de bases de datos con el que se desea conectar. Es así que PHP proporciona un amplio número de funciones para trabajar con bases de datos MySQL, PostgreSQL, MSSQL e incluso Oracle, entre otras. En el caso de MySQL se puede trabajar usando las extensiones de MySQLi que son las más recomendadas por su rapidez como mysqli_connect(), mysqli_query(), mysqli_fetch_array(), mysqli_fetch_assoc(), mysqli_fetch_object, mysqli_errno(), etc. Modularidad En PHP es posible hacer uso de la característica de modularidad utilizando las sentencias include() o require() para implementar la reutilización del código definido en archivos con código PHP. La sintaxis de estas sentencias son las siguientes: Lenguajes Interpretados en el Servidor 13 Guía # 3: Matrices y funciones en PHP include('nombre_de_archivo'); ----------------------------require('nombre_de_archivo'); NOTA: Los paréntesis son opcionales. Si no se incluyen debe dejar espacio entre la palabra reservada include|require y el delimitador de cadena, que puede ser comilla simple o doble. En la sintaxis anterior ‘nombre_de_archivo’ es el nombre del archivo que se desea incluir o evaluar dentro del script que utiliza esta sentencia. La modularidad permite que se pueda dividir un script en scripts más pequeños y manejables que permitan realizar modificaciones de forma más rápida y ordenada; es decir, si en algún momento debe hacerse un cambio importante en un sitio creado con PHP, la modularidad permitiría modificar lo menos posible los scripts de la aplicación. Debería ser en la mayoría de los casos un sólo script el que debería de modificarse. Esto es una enorme ventaja para el programador. III. MATERIALES Y EQUIPO Para la realización de la guía de práctica se requerirá lo siguiente: No. Material 1 Guía de práctica #3: Matrices y funciones en PHP 2 Computadora con WampServer, Sublime Text y PHP Designer instalados 3 Memoria USB o disco flexible Cantidad 1 1 1 IV. PROCEDIMIENTO Indicaciones: Asegúrese de digitar el código de los siguientes ejemplos que se presentan a continuación. Tenga en cuenta que el PHP Designer no es compilador solamente un editor. Por lo tanto, los errores de sintaxis los podrá observar únicamente hasta que se ejecute el script cargando la página en el navegador de su preferencia. Ejercicio #1: El siguiente ejemplo muestra una lista de estudiantes y su nota registrada en una matriz asociativa, mostrando cómo recorrer los elementos de una matriz haciendo uso de la sentencia foreach. Archivo 1: notasalumnos.php <?php $nombres = array( 'Claudia Salazar' => 6.4, 'Lorena L&oacute;pez' => 6.3, 'Carlos &Aacute;valos' => 7.5, 'Jennifer V&aacute;squez' => 6.2, 'Roxana Calder&oacute;n' => 7.5, 'Pedro Hidalgo' => 5.8, 'Morena Barraza' => 6.0, 'Beatriz Hern&aacute;ndez' => 5.0, 'Alberto Figueroa' => 9.5, 'Julia Garc&iacute;a' => 8.5, 'Ileana Dominguez' => 8.2, 'Oscar Reyes' => 8.5, 'Lorena Linares' => 4.8, 'Ramiro Zepeda' => 5.5, 'Luis Pe&ntilde;ate' => 9.6, 'Jos&eacute; Menjivar' => 6.0, 'Sonia Leiva' => 5.1, 'Ernesto Fuentes' => 6.0, 'Claudia Ponce' => 6.8, Lenguajes Interpretados en el Servidor 14 Guía # 3: Matrices y funciones en PHP 'Cristina Morales' => 7.6, 'Javier Hurtado' => 7.0 ); echo "<!DOCTYPE html>"; echo "<html>\n"; echo "<head>\n"; echo "\t<title>Uso del foreach para recorrer una matriz</title>\n"; echo "\t<link type=\"text/css\" rel=\"stylesheet\" href=\"css/notasalumnos.css\" />\n"; echo "</head>\n"; echo "<body>\n"; echo "<header>\n"; echo "\t<h1>Notas de los estudiantes</h1><hr>\n"; echo "</header>\n"; echo "<section>\n"; echo "<article>\n"; echo "\t<table>\n"; echo "\t\t<thead>\n"; echo "\t\t\t<tr>\n"; echo "\t\t\t\t<th>\n"; echo "\t\t\t\t\tNombre\n"; echo "\t\t\t\t</th>\n"; echo "\t\t\t\t<th>\n"; echo "\t\t\t\t\tCUM\n"; echo "\t\t\t\t</th>\n"; echo "\t\t\t</tr>\n"; echo "\t\t</thead>\n"; echo "\t\t<tbody>\n"; foreach($nombres as $name => $nota){ echo "\t\t\t<tr>\n"; echo "\t\t\t\t<td>\n"; echo "\t\t\t\t\t$name\n</td>\n"; echo "\t\t\t\t<td class=\"cum\">\n"; echo "\t\t\t\t\t" . number_format($nota, 1, '.', ',') . "\n"; echo "\t\t\t\t</td>\n"; echo "\t\t\t</tr>\n"; } echo "\t\t</tbody>\n"; echo "\t</table>\n"; echo "</article>\n"; echo "</section>\n"; echo "</body>\n"; echo "</html>"; ?> media=\"screen\" Archivo 2: notasalumnos.css body { background-color:#6cbd70; filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#6cbd70, endColorstr=#b086ab); background-image:-moz-linear-gradient(top, #6cbd70 0%, #b086ab 100%); background-image:-webkit-linear-gradient(top, #6cbd70 0%, #b086ab 100%); background-image:-ms-linear-gradient(top, #6cbd70 0%, #b086ab 100%); background-image:linear-gradient(top, #6cbd70 0%, #b086ab 100%); background-image:-o-linear-gradient(top, #6cbd70 0%, #b086ab 100%); background-image:-webkit-gradient(linear, right top, right bottom, colorstop(0%,#6cbd70), color-stop(100%,#b086ab)); } h1 { font:bold 20pt "Myriad Pro","Bodoni MT Black",Rockwell,Helvetica,sans-serif; Lenguajes Interpretados en el Servidor 15 Guía # 3: Matrices y funciones en PHP color:#033006; text-align:center; } table { border-collapse:collapse; border:8px outset DarkSlateBlue; left:-10%; margin-left:50%; position:relative; width:20%; } tr { border:1px solid DarkSlateBlue; } th { border:1px solid DarkSlateBlue; background-color:rgb(0,100,100); color:Gold; font:bold 12pt "Lucida Sans","Century Gothic",Helvetica,sans-serif; line-height:1.4em; text-align:center; } td { color:rgb(60,0,90); font:normal 11pt "Century Gothic","Lucida Sans",Helvitica,sans-serif; } tr:hover { background-color:#f5f59d; filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#f5f59d, endColorstr=#e4f222); background-image:-moz-linear-gradient(top, #f5f59d 0%, #e4f222 100%); background-image:-webkit-linear-gradient(top, #f5f59d 0%, #e4f222 100%); background-image:-ms-linear-gradient(top, #f5f59d 0%, #e4f222 100%); background-image:linear-gradient(top, #f5f59d 0%, #e4f222 100%); background-image:-o-linear-gradient(top, #f5f59d 0%, #e4f222 100%); background-image:-webkit-gradient(linear, right top, right bottom, colorstop(0%,#f5f59d), color-stop(100%,#e4f222)); color: rgb(60,0,90); font-weight: Bold; } .cum { text-align:center; } Ejercicio #2: El siguiente ejercicio permite crear una serie de letras o números dependiendo de la selección del usuario en un control de menú desplegable. Para crear la serie generado se utiliza la función range(), proporcionando todos argumentos: el valor inicial y final de la serie, así como, el desplazamiento para la secuencia de cada elemento. Archivo 1: series.php <!DOCTYPE html> <html lang="es"> <head> <title>Uso de la funci&oacute;n range</title> <link type="text/css" rel="stylesheet" media="screen" href="css/series.css" /> Lenguajes Interpretados en el Servidor 16 Guía # 3: Matrices y funciones en PHP <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> </body> <header> <h1>Generaci&oacute;n de series con funci&oacute;n de matrices</h1> </header> <section> <article> <form action="series.php" method="POST"> <fieldset> <legend>Tipos de series</legend> <label for="seltipo">Escoja el tipo de serie:</label> <select name="seltipo"> <option value="AlfabetoMin" selected="selected">Alfabeto en min&uacute;sculas</option> <option value="AlfabetoMay">Alfabeto en may&uacute;sculas</option> <option value="NumerosPares">N&uacute;meros pares</option> <option value="NumerosImpares">N&uacute;meros impares</option> </select><br /> <input type="submit" name="enviar" value="Enviar"> </fieldset> </form> </article> <article> <?php if(isset($_POST['enviar'])){ $tiposecuencia = isset($_POST['seltipo']) ? $_POST['seltipo'] : ""; switch($tiposecuencia){ case "AlfabetoMin": $inicio = 'a'; $final = 'z'; $salto = '1'; break; case "AlfabetoMay"; $inicio = 'A'; $final = 'Z'; $salto = '1'; break; case "NumerosPares": $inicio = '0'; $final = '50'; $salto = '2'; break; case "NumerosImpares": $inicio = '1'; $final = '50'; $salto = '2'; break; } $secuencia = range($inicio,$final,$salto); foreach($secuencia as $letra) echo "<span class=\"caracter\">" . $letra . "</span>&nbsp;&nbsp;\n"; } ?> </article> </section> </body> </html> Archivo 2: series.css body { Lenguajes Interpretados en el Servidor 17 Guía # 3: Matrices y funciones en PHP background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0.52, #FFF04A),color-stop(1, #FAFA82)); background-image: -o-linear-gradient(bottom, #FFF04A 52%, #FAFA82 100%); background-image: -moz-linear-gradient(bottom, #FFF04A 52%, #FAFA82 100%); background-image: -webkit-linear-gradient(bottom, #FFF04A 52%, #FAFA82 100%); background-image: -ms-linear-gradient(bottom, #FFF04A 52%, #FAFA82 100%); background-image: linear-gradient(to bottom, #FFF04A 52%, #FAFA82 100%); } h1 { color: Brown; font: bold 20pt "Myriad Pro","Bodoni MT Black",Rockwell,Helvetica,sans-serif; text-align: center; text-shadow: 5px 2px 2px rgba(90,42,35,0.75); } article { height: auto; margin: 20px auto; width: 44%; } fieldset { background-color:Lavender; left:-18%; margin-left:50%; position:relative; width:36%; } legend { color:Indigo; font:bold 12pt "Lucida Sans","Calisto MT","Bodoni MT",Helvetica,sans-serif; } label { color:DarkGreen; font:600 10.5pt "Lucida Sans","Bodoni MT",Helvetica,sans-serif; } .caracter { color:Indigo; font:600 10pt "Lucida Sans Unicode",Georgia,Helvetica,sans-serif; } Ejercicio #3: El siguiente ejemplo muestra cómo recorrer y mostrar una matriz bidimensional asociativa con ciclos foreach para mostrar en forma ordenada la información de cada registro en una tabla. Archivo 1: registro.php <!DOCTYPE html> <html lang="es"> <head> <title>Mi agenda</title> <link type="text/css" rel="stylesheet" media="screen" href="css/registro.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <header> <h1>Estudiantes registrados</h1><hr /> </header> <?php $alumnos = array( Lenguajes Interpretados en el Servidor 18 Guía # 3: Matrices y funciones en PHP "registro 1" => array( "carnet" "nombre" "apellido" "telefono" ), "registro 2" => array( "carnet" "nombre" "apellido" "telefono" ), "registro 3" => array( "carnet" "nombre" "apellido" "telefono" ), "registro 4" => array( "carnet" "nombre" "apellido" "telefono" ), "registro 5" => array( "carnet" "nombre" "apellido" "telefono" ), "registro 6" => array( "carnet" "nombre" "apellido" "telefono" ) => => => => 'EG070425', 'Mario Alexander', 'Erazo Guti&eacute;rrez', '2221-0916' => => => => 'RD070316', 'Edgard Antonio', 'Rodr&iacute;guez Dur&aacute;n', '2221-0673' => => => => 'FS060546', 'Gerardo Arturo', 'Fonseca Saravia', '2226-1539' => => => => 'SG063125', 'Ana Lilian', 'Santana God&iacute;nez', '2292-0425' => => => => 'EJ052105', 'Clara Asunci&oacute;n', 'Escamilla Jovel', '2221-1385' => => => => 'EJ052105', 'Pedro Jos&eacute;', 'Cruz Rodr&iacute;guez', '2256-6340' ); //Imprimir los elementos de la matriz echo "<section>\n"; echo "\t<article>\n"; echo "\t\t<table>\n"; echo "\t\t\t<tr><th>Campo</th><th>Dato</th></tr>\n"; foreach($alumnos as $registro => $datos){ echo "\t\t\t<tr><th colspan=\"2\">$registro</th></tr>\n"; foreach($datos as $indice => $valor){ echo "\t\t\t<tr><td>$indice</td><td>$valor</td></tr>\n"; } } echo "\t\t</table>\n"; echo "\t</article>\n"; echo "</section>\n" ?> </body> </html> Archivo 2: registro.css * { border: 0; margin: 0; padding: 0; } Lenguajes Interpretados en el Servidor 19 Guía # 3: Matrices y funciones en PHP body { background: rgba(188,235,203,1); background: -moz-linear-gradient(-45deg, rgba(188,235,203,1) 0%, rgba(122,240,224,1) 100%); background: -webkit-gradient(left top, right bottom, color-stop(0%, rgba(188,235,203,1)), color-stop(100%, rgba(122,240,224,1))); background: -webkit-linear-gradient(-45deg, rgba(188,235,203,1) 0%, rgba(122,240,224,1) 100%); background: -o-linear-gradient(-45deg, rgba(188,235,203,1) 0%, rgba(122,240,224,1) 100%); background: -ms-linear-gradient(-45deg, rgba(188,235,203,1) 0%, rgba(122,240,224,1) 100%); background: linear-gradient(135deg, rgba(188,235,203,1) 0%, rgba(122,240,224,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bcebcb', endColorstr='#7af0e0', GradientType=1 ); } h1 { background-color:Brown; border:2px double rgb(20,80,40); color:rgb(200,250,180); font:bold 22pt "Bodoni MT Black","Cooper Black",Helvetica,sans-serif; text-align:center; } table { background-color:rgb(190,240,180); border:5px groove Brown; left:50%; margin-left:-9%; position:relative; width:18%; } th { background-color:Orange; border:3px solid BurlyWood; font-family:Garamond; font-size:11pt; font-weight:800; } td { border:3px solid #a52a2a; font-family:Georgia; font-size:10pt; font-weight:400; } Ejercicio #4: En este ejemplo se ingresan una serie de productos a través de un formulario. Los nuevos productos se ingresan en un cuadro de texto y mediante un botón son agregados a un cuadro de lista. Mediante un botón de envío los datos ingresados y seleccionados del cuadro de lista son enviados para que sean procesados por el script PHP. La aplicación incluye un script .js que se encarga de la funcionalidad de agregar productos al cuadro de lista. Archivo 1: productos.html <!DOCTYPE html> <html lang="es"> <head> <title>Listado de productos</title> <link type="text/css" rel="stylesheet" media="screen" href="css/productos.css" /> Lenguajes Interpretados en el Servidor 20 Guía # 3: Matrices y funciones en PHP <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> <script type="text/javascript" src="js/productos.js"></script> </head> <body> <section> <article> <form name="frmproductos" action="productos.php" method="POST"> <fieldset> <legend><span>Ingreso de productos:</span></legend> <ul> <li> <label for="producto">Nuevo producto:</label> <div class="campo"> <input type="text" name="producto" id="producto" maxlength="60" placeholder="(Ingrese un producto)" /> <input type="reset" name="agregar" id="agregar" value="Agregar" /> </div> </li> <li> <label for="ingresados">Productos ingresados:</label> <div class="campo"> <select name="ingresados[]" id="ingresados" size="6" multiple="multiple"></select> </div> </li> <li> <div class="campo"> <input type="submit" name="enviar" id="enviar" value="Enviar" class="boton" /> </div> </li> </ul> </fieldset> </form> </body> </article> </section> </html> Archivo 2: productos.js window.onload = initForms; function initForms(){ document.getElementById("agregar").onclick = function(){ addProducts(document.frmproductos.ingresados, document.frmproductos.producto.value); } document.getElementById("enviar").onclick = function(){ var contador = 0; for(var i=0; i<document.frmproductos.ingresados.options.length; i++){ if(document.frmproductos.ingresados.options[i].selected){ contador++; } } if(contador == 0){ alert("No se han seleccionado elementos."); return false; } } } function addProducts(optionMenu, value){ Lenguajes Interpretados en el Servidor 21 Guía # 3: Matrices y funciones en PHP var posicion = optionMenu.length; optionMenu[posicion] = new Option(value, value); } Archivo 3: productos.css body { background-image: rgba(223,231,233,1); background-image: -moz-linear-gradient(45deg, rgba(223,231,233,1) 0%, rgba(112,180,207,1) 52%, rgba(79,154,186,1) 100%); background-image: -webkit-gradient(left bottom, right top, color-stop(0%, rgba(223,231,233,1)), color-stop(52%, rgba(112,180,207,1)), color-stop(100%, rgba(79,154,186,1))); background-image: -webkit-linear-gradient(45deg, rgba(223,231,233,1) 0%, rgba(112,180,207,1) 52%, rgba(79,154,186,1) 100%); background-image: -o-linear-gradient(45deg, rgba(223,231,233,1) 0%, rgba(112,180,207,1) 52%, rgba(79,154,186,1) 100%); background-image: -ms-linear-gradient(45deg, rgba(223,231,233,1) 0%, rgba(112,180,207,1) 52%, rgba(79,154,186,1) 100%); background-image: linear-gradient(45deg, rgba(223,231,233,1) 0%, rgba(112,180,207,1) 52%, rgba(79,154,186,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dfe7e9', endColorstr='#4f9aba', GradientType=1 ); } fieldset { background-color:rgb(190,220,230); border:6px ridge rgb(50,100,150); left:-23%; margin-left:50%; position:relative; width:46%; } legend span { background-color:rgb(20,20,100); border:3px ridge rgb(50,100,150); color:rgb(225,250,250); display:block; font:bold 9pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; padding:2px 5px; } label { color:rgb(30,60,100); display:block; float:left; font:normal 9pt "Arial Rounded MT Bold","Century Gothic",Helvetica,sans-serif; padding-top:0.6em; padding-bottom:0.6em; text-align:right; width:30%; } .campo { display:block; float:right; position:relative; width:68%; } .boton bottom:-0.2em; { Lenguajes Interpretados en el Servidor 22 Guía # 3: Matrices y funciones en PHP display:block; left:-2.5em; margin-left:50%; position:relative; width:5em; } ul { list-style-type:none; margin:0; padding:0; } li { display:block; line-height:2.1em; } table { border:8px groove rgb(100,10,5); border-collapse:collapse; position:relative; left:-9%; margin-left:50%; width:18%; } tr { border:1px solid rgb(120,20,20); } th { background-color:rgb(90,5,3); color:rgb(250,240,200); font:bold 14pt Garamond,Helvetica,sans-serif; } td { background-color:rgb(250,240,200); color:rgb(100,10,10); font:normal 14pt Garamond,Helvetica,sans-serif; } Archivo 4: productos.php <!DOCTYPE html> <html lang="es"> <head> <title>Productos de la tienda</title> <link type="text/css" rel="stylesheet" media="screen" href="css/productos.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <section> <article> <table> <thead> <th class="head">Productos</th> </thead> <tbody> <?php if(isset($_POST['enviar'])){ if(isset($_POST['ingresados'])){ Lenguajes Interpretados en el Servidor 23 Guía # 3: Matrices y funciones en PHP foreach($_POST["ingresados"] as $productos){ echo "<tr>\n<td>$productos</td>\n</tr>"; } } } ?> </tbody> </table> </article> </section> </body> </html> Ejercicio #5: El siguiente ejemplo muestra el uso de la función array_rand() de PHP que permite generar un número de índices aleatorios para mostrar las imágenes de películas de la portada. Luego, se puede seleccionar un nombre de película y la cantidad de boletos de entrada que se desean adquirir. Al enviar el formulario y utilizando una matriz bidimensional asociativa se puede crear un boleto que indica el precio a pagar por el número de entradas adquirido. Archivo 1: cartelera.php <!DOCTYPE html> <html lang="es"> <head> <title>Cartelera de cine</title> <link type="text/css" rel="stylesheet" media="screen" href="css/cartelera.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <header> <h1>Cartelera de cine</h1> </header> <section> <?php //Creamos una variable con el directorio o carpeta que contiene las imágenes $dir = "img"; //Creamos una matriz con los nombres de las imágenes que se almacenan en el directorio $peliculas = array( "al-diablo-con-el-diablo.jpg", "click.jpg", "cruzada.jpg", "efecto-mariposa.jpg", "busca-de-la-felicidad.jpg", "amenaza-fantasma.jpg", "la-milla-verde.jpg", "la-propuesta.jpg", "comunidad-del-anillo.jpg", "sexto-sentido.jpg" ); //Obtener cuatro claves de la matriz $peliculas $claves = array_rand($peliculas, 4); //Creando una estructura de 3 columnas con elementos DIV ?> <article> <img src="<?php echo $dir . "/" . $peliculas[$claves[0]]; ?>" width="200" /><br /> <img src="<?php echo $dir . "/" . $peliculas[$claves[1]]; ?>" width="200" /> </article> <article> <hgroup> <h2>CINE REFORMA</h2> <h3>Los mejores estrenos los encuentras aqu&iacute;</h3> <h4>Estas son las pel&iacute;culas en cartelera</h4> </hgroup> <div id=""> <form action="pagoentrada.php" method="POST"> <fieldset> <legend><span>Entrada al cine</span></legend> Lenguajes Interpretados en el Servidor 24 Guía # 3: Matrices y funciones en PHP <label for="pelicula">Pel&iacute;cula</label> <select name="pelicula" id="pelicula"> <option value="mov0001" selected="selected">Al diablo con el diablo</option> <option value="mov0002">Click</option> <option value="mov0003">Cruzada</option> <option value="mov0004">El efecto mariposa</option> <option value="mov0005">En busca de la felicidad</option> <option value="mov0006">La amenaza fastasma</option> <option value="mov0007">Milagros inesperados</option> <option value="mov0008">La propuesta</option> <option value="mov0009">La comunidad del anillo</option> <option value="mov0010">El sexto sentido</option> </select><br /> <label for="cantidad">Cantidad</label> <input type="text" name="cantidad" id="cantidad" maxlength="1" placeholder="Cantidad" pattern="\d{1}" required /><br /> <input type="submit" name="comprar" value="Comprar" /> </fieldset> </form> </div> </article> <article> <img src="<?php echo $dir . "/" . $peliculas[$claves[2]]; ?>" width="200" /><br /> <img src="<?php echo $dir . "/" . $peliculas[$claves[3]]; ?>" width="200" /> </article> </section> </body> </html> Archivo 2: cartelera.css body font: 16px; } h1 { { font: 2.2em Bold Geneva,Helvetica,sans-serif; margin: 2% auto; text-align: center; text-shadow: 5px 2px 2px rgba(90,42,35,0.75); } hgroup h2 { font: 1.75em Bold Verdana,Helvetica,sans-serif; text-align: center; } section { background: -moz-linear-gradient(top, rgba(243,226,199,0.93) 0%, rgba(243,226,199,0.93) 1%, rgba(233,212,179,.93) 5%, rgba(182,141,76,1) 100%); /*FF3.6+*/ background: -webkit-gradient(linear, left top, left bottom, colorstop(0%,rgba(243,226,199,0.93)), color-stop(1%,rgba(243,226,199,0.93)), colorstop(5%,rgba(233,212,179,0.93)), color-stop(100%,rgba(182,141,76,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, rgba(243,226,199,0.93) 0%,rgba(243,226,199,0.93) 1%,rgba(233,212,179,0.93) 5%,rgba(182,141,76,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, rgba(243,226,199,0.93) 0%,rgba(243,226,199,0.93) 1%,rgba(233,212,179,0.93) 5%,rgba(182,141,76,1) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, rgba(243,226,199,0.93) 0%,rgba(243,226,199,0.93) 1%,rgba(233,212,179,0.93) 5%,rgba(182,141,76,1) 100%); /* IE10+ */ background: linear-gradient(to bottom, rgba(243,226,199,0.93) Lenguajes Interpretados en el Servidor 25 Guía # 3: Matrices y funciones en PHP 0%,rgba(243,226,199,0.93) 1%,rgba(233,212,179,0.93) 5%,rgba(182,141,76,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#edf3e2c7', endColorstr='#b68d4c',GradientType=0 ); /* IE6-9 */ -moz-border-radius: 15px; -webkit-border-radius: 15px; -o-border-radius: 15px; -ms-border-radius: 15px; border-radius: 15px; behavior:url(css/border-radius.htc); margin: 2% auto; vertical-align: top; width: 98%; } article { /* border: 1px solid Blue; */ display: inline-block; margin: 0 2%; min-height: 560px; padding-left: 4%; padding-top: 2%; padding-bottom: 2%; vertical-align: top; width: 25%; } article img { display: block; -moz-box-shadow: 3px 3px 3px 3px rgba(100,50,40,0.75); -webkit-box-shadow: 3px 3px 3px 3px rgba(100,50,40,0.75); -o-box-shadow: 3px 3px 3px 3px rgba(100,50,40,0.75); -ms-box-shadow: 3px 3px 3px 3px rgba(100,50,40,0.75); box-shadow: 3px 3px 3px 3px rgba(100,50,40,0.75); } /* Estilos para el formulario */ form { margin:auto; width:286px; padding:12px; border:1px solid #270644; /* Agregando propiedades CSS3 */ -ms-border-radius:12px; -moz-border-radius:12px; -webkit-border-radius:12px; -khtml-border-radius:12px; border-radius:12px; behavior:url(css/border-radius.htc); /* Color de fondo del formulario con degradado con gradiente */ background: rgb(239,197,202); /* Old browsers */ background: -moz-linear-gradient(45deg, rgba(239,197,202,1) 0%, rgba(241,142,153,1) 3%, rgba(210,75,90,1) 37%, rgba(186,39,55,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left bottom, right top, colorstop(0%,rgba(239,197,202,1)), color-stop(3%,rgba(241,142,153,1)), colorstop(37%,rgba(210,75,90,1)), color-stop(100%,rgba(186,39,55,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(45deg, rgba(239,197,202,1) 0%,rgba(241,142,153,1) 3%,rgba(210,75,90,1) 37%,rgba(186,39,55,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(45deg, rgba(239,197,202,1) 0%,rgba(241,142,153,1) 3%,rgba(210,75,90,1) 37%,rgba(186,39,55,1) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(45deg, rgba(239,197,202,1) 0%,rgba(241,142,153,1) 3%,rgba(210,75,90,1) 37%,rgba(186,39,55,1) 100%); /* IE10+ */ background: linear-gradient(45deg, rgba(239,197,202,1) 0%,rgba(241,142,153,1) Lenguajes Interpretados en el Servidor 26 Guía # 3: Matrices y funciones en PHP 3%,rgba(210,75,90,1) 37%,rgba(186,39,55,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#efc5ca', endColorstr='#ba2737',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ /* Sombra a los costados de las cajas */ box-shadow:0px -5px 300px #270644; -ms-box-shadow:0px -5px 300px #270644; -moz-box-shadow:0px -5px 300px #270644; -webkit-box-shadow:0px -5px 300px #270644; } legend { display: block; color: #F0E68C; font: Bold 1em Linotype,sans-serif; width: 124px; padding: 5px; } label { display:block; color: #F0E68C; font: Bold 0.9em Linotype,sans-serif; width: 60px; padding: 6px; /* border: 1px solid White; */ } input, select { width: 250px; background: #8a33c6; padding: 6px; margin-bottom: 10px; border-top: 1px solid #808080; border-left: 1px solid #808080; border-right: 1px solid #AD64E0; border-bottom: 1px solid #AD64E0; /* Agregando propiedades CSS3 */ -webkit-transition-property: -webkit-box-shadow, background; -webkit-transition-duration: 0.25s; -moz-box-shadow: 0px 0px 2px #000; -webkit-box-shadow: 0px 0px 2px #000; } input[type=text] { font: Normal 1em Palatino,Helvetica,sans-serif; background: #DEB887; color: #8B0000; } select { font: Normal 1em Palatino,Helvetica,sans-serif; background: #DEB887; color: #8B0000; } input[type=submit] { background-color:#A0522D; color:#DEB887; border-top: 2px solid #F5DEB3; border-left: 2px solid #F5DEB3; border-right: 2px solid #BC8F8F; border-bottom: 2px solid #BC8F8F; Lenguajes Interpretados en el Servidor 27 Guía # 3: Matrices y funciones en PHP text-transform:uppercase; font:Bold 1em Linotype,sans-serif; } input[type=submit]:hover { background: #905020; color: #DFBCA7; } input:hover { -webkit-box-shadow: 0px 0px 4px #000; background: #A0522D; } select:hover { -webkit-box-shadow: 0px 0px 4px #000; background: #A0522D; } Archivo 3: pagoentrada.php <!DOCTYPE html> <html> <head> <title>Boleto de entrada</title> <link type="text/css" rel="stylesheet" media="screen" href="css/tables.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <?php $peliculas = array( "mov0001" => array( "titulo" => "Al diablo con el diablo", "precio" => 3.75, "sala" => "Sala 1", "hora" => "7:00 pm" ), "mov0002" => array( "titulo" => "Clic", "precio" => 3.75, "sala" => "Sala 3", "hora" => "5:00 pm" ), "mov0003" => array( "titulo" => "Cruzada", "precio" => 3.00, "sala" => "Sala 2", "hora" => "1:00 pm" ), "mov0004" => array( "titulo" => "El efecto mariposa", "precio" => 3.75, "sala" => "sala 3", "hora" => "6:00 pm" ), "mov0005" => array( "titulo" => "En busca de la felicidad", "precio" => 3.00, "sala" => "Sala 5", "hora" => "3:00 pm" ), "mov0006" => array( "titulo" => "La amenaza fastasma", Lenguajes Interpretados en el Servidor 28 Guía # 3: Matrices y funciones en PHP "precio" => 3.75, "sala" => "sala 4", "hora" => "6:00 pm" ), "mov0007" => array( "titulo" => "Milagros inesperados", "precio" => 3.75, "sala" => "Sala 2", "hora" => "1:00 pm" ), "mov0008" => array( "titulo" => "La propuesta", "precio" => 3.75, "sala" => "sala 1", "hora" => "9:00 pm" ), "mov0009" => array( "titulo" => "La comunidad del anillo", "precio" => 3.75, "sala" => "Sala 5", "hora" => "7:00 pm" ), "mov0010" => array( "titulo" => "El sexto sentido", "precio" => 3.75, "sala" => "sala 3", "hora" => "8:45 pm" ) ); //Procesando los datos enviados del formulario if(isset($_POST['comprar'])){ $movie = isset($_POST['pelicula']) ? $_POST['pelicula'] : ""; switch($movie){ case "mov0001": $seleccionada = $peliculas["mov0001"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0002": $seleccionada = $peliculas["mov0002"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0003": $seleccionada = $peliculas["mov0003"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0004": $seleccionada = $peliculas["mov0004"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0005": $seleccionada = $peliculas["mov0005"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0006": $seleccionada = $peliculas["mov0006"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; Lenguajes Interpretados en el Servidor 29 ? ? ? ? ? ? Guía # 3: Matrices y funciones en PHP break; case "mov0007": $seleccionada = $peliculas["mov0007"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0008": $seleccionada = $peliculas["mov0008"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0009": $seleccionada = $peliculas["mov0009"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; case "mov0010": $seleccionada = $peliculas["mov0010"]; $cantidad = (isset($_POST['cantidad']) && is_numeric($_POST['cantidad'])) $_POST['cantidad'] : 0; break; } //Iniciando la tabla con la información de la película seleccionada ?> <section> <article> <table id="hor-zebra" summary="Datos recibidos del formulario"> <caption>Informaci&oacute;n de formulario</caption> <thead> <tr class="thead"> <th scope="col" colspan="2">Boleto de entrada</th> </tr> </thead> <tbody> <?php //Obtiniendo los datos de la película seleccionada que está almacenada en $seleccionada $table = ""; $i = 1; foreach($seleccionada as $indice => $dato){ if($i%2 != 0){ $table .= "\t<tr class=\"odd\">\n"; } else{ $table .= "\t<tr class=\"even\">\n"; } if($indice == "precio"){ $dato *= $cantidad; $dato = "\$" . number_format((double)$dato, 2, ".", ","); } $table .= "\t\t<td>$indice</td>\n"; $table .= "\t\t<td> $dato</td>\n\t</tr>\n"; $i++; } echo $table; } ?> </tbody> </table> <a href="cartelera.php">Ingresar otra pel&iacute;cula</a> </article> </section> </body> Lenguajes Interpretados en el Servidor 30 ? ? ? ? Guía # 3: Matrices y funciones en PHP </html> Archivo 4: tables.css body { line-height: 1.6em; } caption { font: Bold 1.25em "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; color: rgb(100,50,40); } /* Estilos ocupados en el ejemplo de formularios */ #hor-zebra { font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; font-size: 12px; margin: 45px; width: 480px; text-align: left; border-collapse: collapse; } #hor-zebra th { font-size: 14px; font-weight: normal; padding: 10px 8px; color: #039; } #hor-zebra td { padding: 8px; color: rgb(100,50,40); } #hor-zebra .thead { background-color: rgb(100,50,40); } #hor-zebra .thead th { padding: 10px 8px; color: #FFDEAD; font:Bold 12px "Lucida Sans Unicode", Helvetica, Sans-Serif; } #hor-zebra .odd { background-color: #F0E68C; } #hor-zebra .even { background-color: #F9EC96; } Ejercicio #6: El siguiente ejemplo muestra cómo generar una tabla de multiplicar solicitando el número de la tabla al usuario a través de un formulario. Se valida el valor numérico que el usuario ingresa haciendo uso de validación en el cliente con JavaScript. Archivo 1: entrada.html <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Introducci&oacute;n de datos</title> Lenguajes Interpretados en el Servidor 31 Guía # 3: Matrices y funciones en PHP <link type="text/css" rel="stylesheet" media="screen" href="css/form.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> <script type="text/javascript" src="js/validar.js"></script> </head> <body> <header> <h1 align="center">Ejemplo de uso de Funci&oacute;n</h1> <hr /> </header> <section> <article> <form method="POST" action="tabla.php" enctype="multipart/form-data" name="frmingreso" id="frmingreso"> <fieldset> <legend><span>C&aacute;lculo del factorial</span></legend> <ul> <li class="campo"> <label for="txtnumero">N&uacute;mero: </label> <input type="text" name="txtnumero" id="txtnumero" maxlength="3" placeholder="(Ingrese un número entero)" pattern="[0-9]{1,3}" required="required" /><br /> <span id="numbersOnly">Ingrese n&uacute;meros</span> </li> <li class="campo"> <input type="submit" name="enviar" value="Mostrar" class="boton" />&nbsp; <input type="reset" name="limpiar" value="Cancelar" class="boton" /> </li> </ul> </fieldset> </form> </article> </section> </body> </html> Archivo 2: form.css fieldset { background-color:rgb(190,220,230); border:6px ridge rgb(50,100,150); left:-16%; margin-left:50%; position:relative; width:32%; } legend span { background-color:rgb(20,20,100); border:3px ridge rgb(50,100,150); color:rgb(225,250,250); display:block; font:Bold 9pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; padding:2px 5px; } label { color:rgb(30,60,100); display:block; float:left; font:normal 9pt "Arial Rounded MT Bold","Century Gothic",Helvetica,sans-serif; padding-bottom:0.6em; padding-top:0.6em; Lenguajes Interpretados en el Servidor 32 Guía # 3: Matrices y funciones en PHP text-align:right; width:30%; } .campo { display:block; float:right; position:relative; width:68%; } .boton { background:rgb(50,50,120); border:3px outset rgb(60,50,60); bottom:-0.2em; color:Yellow; display:inline; font:Bold 9pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; position:relative; } .boton:hover { background:rgb(90,90,150); color:White; } #numbersOnly { background:Orange; border:3px ridge rgb(50,50,120); color:White; font:Bold 8pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; visibility:hidden; } ul { list-style-type:none; margin:0; padding:0; } li { display:block; line-height:2.1em; } Archivo 3: tabla.css #tablamulti, #enlace { margin:0 auto; width:18%; } #enlace { font:normal 12pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; text-align:center; } caption { color:rgb(30,30,30); font:bold 11pt "Lucida Sans",Tahoma,Helvetica,sans-serif; padding-bottom:6px; padding-top:6px; text-align:center; Lenguajes Interpretados en el Servidor 33 Guía # 3: Matrices y funciones en PHP } table { border:3px groove rgb(111,3,6); border-collapse:collapse; } th { background-color:rgb(233,122,155); border:2px solid rgb(111,5,9); border-collapse:collapse; font:bold 12pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; text-align:center; } td { border-collapse:collapse; border:2px solid rgb(111,5,9); background-color:rgb(225,225,225); text-align:center; font:normal 11pt "Lucida Sans",Tahoma,Helvetica,sans-serif; } Archivo 4: tabla.php <!DOCTYPE html> <html lang="es"> <head> <title>Tablas de multiplicar</title> <link type="text/css" rel="stylesheet" media="screen" href="css/tabla.css" /> </head> <body> <section> <article> <?php function escribir_tabla(){ $num = (isset($_POST['txtnumero']) && is_int(intval($_POST['txtnumero']))) ? $_POST['txtnumero'] : 0; if($num != 0){ echo "<div id=\"tablamulti\">\n"; echo "<table>\n"; echo "<caption>Tabla del $num</caption>\n"; echo "<thead>\n<tr>\n<th colspan=\"3\">\n"; echo "Tabla del n&uacute;mero $num\n"; echo "</th>\n</thead>\n"; echo "<tbody>\n"; for($i=1; $i<=20; $i++){ echo "<tr>\n"; echo "<td>", $num, "&nbsp;*&nbsp;", $i, "</td>\n"; echo "<td> = </td>\n"; echo "<td>", $num*$i, "</td>\n"; echo "</tr>\n"; } echo "</tbody>\n"; echo "</table>\n"; echo "</div>\n"; } else{ die( "<p class=\"error\">El valor ingresado debe ser un n&uacute;mero entero mayor que cero.</p>\n <div id=\"enlace\">\n<a href=\"entrada.html\">Regresar</a>\n</div>\n" ); Lenguajes Interpretados en el Servidor 34 Guía # 3: Matrices y funciones en PHP } } escribir_tabla(); echo "<div id=\"enlace\">\n<a href=\"entrada.html\">Regresar</a>\n</div>\n"; ?> </article> </section> </body> </html> Archivo 5: validar.js (function(){ //Agregar al manejador de evento load la función init()) if (window.addEventListener) window.addEventListener("load", init, false); else if (window.attachEvent) window.attachEvent("onload", init); // Buscar en el documento todos los elementos INPUT de tipo texto, ya que // solamente en ellos se va a registrar un controlador de evento. function init(){ var inputtag = document.getElementById("txtnumero"); // Hacer un recorrido por todos los campos del formulario if (inputtag.addEventListener){ inputtag.addEventListener("keypress", filter, false); } else { // No utilizamos attachEvent porque no llama a la función de controlador // con el valor correcto de la palabra clave this. En su lugar se invova // con el manejador de evento onkeypress inputtag.onkeypress = filter; } } // Este es el controlador keypress que filtra la entrada del usuario function filter(event) { // Obtener el objeto event y el código de carácter de la tecla pulsada // de forma compatible con todos los navegadores var e = event || window.event; // Objeto de evento de la tecla var code = e.charCode || e.keyCode; // tecla que se ha pulsado // if if if Si se ha pulsado una tecla de función de cualquier tipo, no filtrarla (e.charCode == 0) return true; // Tecla de función (solo para Firefox) (e.ctrlKey || e.altKey) return true; // Se mantienen presionadas Ctrl o Alt (code < 32) return true; // Carácter de Ctrl en tabla ASCII // Dejar pasar teclas de retroceso (BackSpace), tabulación (Tab), entrada (Enter), // escape (Scape) y espacios en blanco (SpaceBar) if (code==0 || code==8 || code==9 || code==13 || code==27 || code==32) return true; // Buscar la información de los caracteres válidos para este campo de entrada var allowed = "0123456789"; // Caracteres válidos var messageElement = document.getElementById("numbersOnly"); // Mensaja a ocultar/mostrar // Convertir el código de carácter a su carácter correspondiente var c = String.fromCharCode(code); // Comprobar si el carácter está dentro del conjunto de caracteres permitidos if (allowed.indexOf(c) != -1) { // Si c es un carácter legal, ocultar el mensaje, si es que existe. if (messageElement) messageElement.style.visibility = "hidden"; return true; // Aceptar el carácter Lenguajes Interpretados en el Servidor 35 Guía # 3: Matrices y funciones en PHP } else { // Si c no está en el conjunto de caracteres permitidos, mostrar el mensaje if (messageElement) messageElement.style.visibility = "visible"; // Y rechazar este evento keypress if (e.preventDefault) e.preventDefault(); if (e.returnValue) e.returnValue = false; return false; } } })(); Ejercicio #7: El siguiente ejemplo muestra cómo generar la serie de Fibonacci solicitando al usuario el número de términos de la serie generada. Este dato es validado en el cliente y en el servidor. Archivo 1: fibonacci.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Serie de Fibonacci</title> <link type="text/css" rel="stylesheet" media="screen" href="css/form.css" /> <link type="text/css" rel="stylesheet" media="screen" href="css/niko.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> <script type="text/javascript" src="js/validar.js"></script> </head> <body> <section> <article> <h2>Serie de Fibonacci con recursividad</h2> <?php if(isset($_GET['enviar'])): //Función de Fibonacci recursiva function fibonacci($n){ if(($n == 0) || ($n == 1)) return $n; return fibonacci($n - 2) + fibonacci($n - 1); } //Verificando el correcto ingreso de los datos $numero1 = isset($_GET['txtnumero']) ? $_GET['txtnumero'] : -1; if($numero1 == -1): $backlink = "<p>El valor del campo no es v&aacute;lido</p>\n"; $backlink .= "<a href=\"{$_SERVER['PHP_SELF']}\" title=\"Regresar\">\n"; $backlink .= "Ingresar dato nuevamente\n</a>\n"; echo $backlink; exit(0); endif; $tabla = "<table>\n"; $tabla .= "<caption>Generando serie de Fibonacci</caption>\n"; $tabla .= "<thead>\n\t"; $tabla .= "<tr>\n\t\t<th scope=\"col\">\n\t\t\tSecuencia\n\t\t</th>\n\t\t"; $tabla .= "<th scope=\"col\">\n\t\t\tValor\n\t\t</th>\n"; $tabla .= "<thead>\n"; $tabla .= "<tbody>\n\t"; $i = 0; while($i <= $numero1){ $class = $i%2 == 0 ? "odd" : "even"; $tabla .= "<tr class=\"$class\">\n\t\t<td>\n\t\t\tF<sub>$i</sub>\n\t\t</td>\n"; $tabla .= "\n\t\t<td>\n\t\t\t" . fibonacci($i) . "\n\t\t</td>\n</tr>\n"; $i++; Lenguajes Interpretados en el Servidor 36 Guía # 3: Matrices y funciones en PHP } $tabla .= "<tbody>\n</table>\n"; echo $tabla; echo "<br />\n<a href=\"{$_SERVER['PHP_SELF']}\" title=\"Regresar\">"; echo "Ingresar nuevos datos</a>"; else: ?> <form action="<?= $_SERVER['PHP_SELF'] ?>" method="GET"> <fieldset> <legend><span>Serie de Fibonacci</span></legend> <ul> <li class="campo"> <label for="numero1">Valores para serie: </label> <input type="text" name="txtnumero" id="txtnumero" size="4" maxlength="3" pattern="[0-9]{1,3}" required /> <span id="numbersOnly">Ingrese n&uacute;meros</span> </li> <li class="campo"> <input type="submit" name="enviar" value="Generar" class="boton" />&nbsp; <input type="reset" name="limpiar" value="Cancelar" class="boton" /> </li> </ul> </fieldset> </form> <?php endif; ?> </article> </section> </body> </html> Archivo 2: niko.css h2 { color: Olive; font: Bold 2em Arial,Helvetica,"Liberation Sans"; text-align: center; } table { border-collapse: collapse; font-family: "Tahoma", Verdana, Arial, Helvetica, sans-serif; font-size: 75%; margin: 0 auto; width:24%; } caption { background: url(img/title.png) no-repeat 50px; font-size: 400%; text-indent: -10000px; } thead tr { background-color: #D9FFD9; border-top: 1px solid black; border-bottom: 1px solid black; } tfoot tr { background-color: #FFFFFF; } Lenguajes Interpretados en el Servidor 37 Guía # 3: Matrices y funciones en PHP thead th { padding: 0.5em; white-space: nowrap; } tfoot th { font-size: 110%; text-align: right; padding-right: 0.5em; letter-spacing: 1px; background: } tfoot td { padding-left: 0.5em; color: red; font-size: 110%; font-weight: 600; } tfoot td:hover { background-color: red; color: white; } tr { background-color: #EAFDFF; } tr.odd { background-color: #FFFFFF; } tbody tr:hover { background-color: #AAFF99; } td, th { border: 1px dotted #CCCCCC; } tbody td { padding: 0.5em; text-align: center; } td a:link, th a:link { color: black; } td a:visited, th a:visited { color: black; text-decoration: line-through; } td a:hover, th a:hover { color: purple; text-decoration: underline; } td:last-child a:hover { color: red; Lenguajes Interpretados en el Servidor 38 Guía # 3: Matrices y funciones en PHP text-decoration: underline overline; } Archivo 3: form.css (el mismo script del Ejercicio #6). Archivo 4: validar.js (el mismo script del Ejercicio #6). Ejercicio #8: En este ejemplo se ilustra cómo utilizar la característica de funciones variables que se puede emplear en PHP. Se tiene una matriz con distintos valores de monedas que se desean convertir a cinco tipos de monedas diferentes. Archivo 1: monedas.php <!DOCTYPE html> <html lang="es"> <head> <title>Convertir entre monedas</title> <link type="text/css" rel="stylesheet" media="screen" href="css/monedas.css" /> </head> <body> <header> <h1>Equivalencias entre monedas</h1><hr> </header> <?php $conversion = array("aDolares","aQuetzal","aLempira","aCordova","aColon"); $precios = array(500,750,1000,1500,3000,7500,12000); function aDolares($dato){ return sprintf("%02.2f", $dato*0.11425); } function aQuetzal($dato){ return sprintf("%02.2f", $dato*0.87214); } function aLempira($dato){ return sprintf("%02.2f", $dato*2.14132); } function aCordova($dato){ return sprintf("%02.2f", $dato*2.60470); } function aColon($dato){ return sprintf("%02.2f", $dato*58.1205); } ?> <section> <article> <table> <thead> <tr> <th>Colones (sv)</th> <th>D&oacute;lares (sv)</th> <th>Quetzales (gt)</th> <th>Lempiras (ho)</th> <th>C&oacute;rdovas (ni)</th> <th>Colones (cr)</th> </tr> </thead> <tbody> <?php for($i=0;$i<sizeof($precios);$i++){ echo "\t<tr>\n"; echo "\t\t<td>\t\t&cent; " . $precios[$i] . "\t\t</td>\n\t\t"; for($j=0;$j<sizeof($conversion);$j++){ $resultado = $conversion[$j]; Lenguajes Interpretados en el Servidor 39 Guía # 3: Matrices y funciones en PHP switch($resultado): case "aDolares": $signo = "$"; break; case "aQuetzal": $signo = "Q"; break; case "aLempira": $signo = "L$"; break; case "aCordova": $signo = "C$"; break; case "aColon": $signo = "&cent;"; break; endswitch; echo "<td>\t\t$signo " . number_format($resultado($precios[$i]),3,".",",") . "\t\t</td>\n\t"; } echo "\t</tr>\n"; } ?> </table> </article> </section> </body> </html> Archivo 2: monedas.css body { background-image: url(../img/coins.jpg); background-position: fixed; background-repeat: repeat; } article{ left: 50%; margin-left: -31%; position: relative; width: 62%; } h1 { color:Gold; font:Bold 2em Eurostile,"Futura Lt",Tahoma,Helvetica,sans-sefif; text-align:center; -moz-text-shadow: 5px 5px 3px #A6A476; -webkit-text-shadow: 5px 5px 3px #A6A476; -o-text-shadow: 5px 5px 3px #A6A476; -ms-text-shadow: 5px 5px 3px #A6A476; text-shadow: 5px 5px 3px #A6A476; } table { border: inset 6px brown; -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; border-radius: 8px; } Lenguajes Interpretados en el Servidor 40 Guía # 3: Matrices y funciones en PHP th { background-color:DarkRed; color:Wheat; font-family:"Bookman Old Style"; font-size:14pt; text-align:center; } td { background-color:LemonChiffon; color:red; font-family:Garamond; font-size:12pt; text-align:center; } Ejercicio #9: El siguiente ejemplo implementa funciones con lista variable de argumentos para obtener el mayor de una lista de números. Los números son proporcionados directamente en el script PHP. Archivo 1: elmayor.php <!DOCTYPE html> <html lang="es"> <head> <title>Trabajando con funciones de lista variable de argumentos</title> <link type="text/css" rel="stylesheet" media="screen" href="css/elmayor.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <header> <h1>Mayor de una lista de n&uacute;meros</h1><hr /> </header> <section> <article id="leftcol"> <?php function elMayor(){ $num_args = func_num_args(); $args = func_get_args(); //$elmayor = ($dato1 > $dato2) ? $dato1 : $dato2; $elmayor = $args[0]; for($i=1; $i<$num_args; $i++){ $elmayor = ($elmayor > $args[$i]) ? $elmayor : func_get_arg($i); } return $elmayor; } echo "El mayor de 58, 167, 242, 85, 31, 109, -26, 81, 16, 126 es " . "<h2>" . elMayor(58, 167, 242, 85, 31, 109, -26, 81, 16, 126) . "</h2>"; ?> </article> <article id="rightcol"> <?php echo "El mayor de 61, 37, 75, 184, 42, -303, 43, 56, -121, 226, 172, 78, 6, 86 es " . "<h2>" . elMayor(61, 37, 75, 184, 42, -303, 43, 56, -121, 226, 172, 78, 6, 86) . "</h2>"; ?> </article> <section> </body> </html> Lenguajes Interpretados en el Servidor 41 Guía # 3: Matrices y funciones en PHP Archivo 2: elmayor.css #leftcol { background-color: red; color: white; float: left; margin: 2.5em 2em; padding: 2.2em; } #rightcol { background-color: green; color: gold; float: right; margin: 2.5em 2em; padding: 2.2em; } article { border-radius: 15px; -webkit-border-radius: 15px; -moz-border-radius: 15px; -o-border-radius: 15px; font: 1em "Lucida Sans Unicode",Helvetica,sans-serif; height: 10em; min-height: 6em; width: 40%; } body { background-image: background-image: background-image: background-image: 85%); background-image: background-image: linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -o-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -moz-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -webkit-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) -ms-linear-gradient(bottom, rgb(68,0,243) 18%, rgb(74,50,160) 85%); -webkit-gradient( linear, left bottom, left top, color-stop(0.18, rgb(68,0,243)), color-stop(0.85, rgb(74,50,160)) ); font-size: 15px; height: 100%; width: 100%; } h1 { font: 2.5em "Myriad Web Pro", Tahoma, Helvetica, sans-serif; color: #fafb3c; text-shadow: 3px 3px 12px rgba(160, 155, 150, 1); } Ejercicio #10: En este ejemplo se ingresan varias edades con validación en el cliente con JavaScript que permite ingresar solo edades numéricamente correctas. Al enviar los datos ingresados en un cuadro de lista se calcula en el servidor el promedio de las edades ingresadas y cada una de las edades que se ingresaron. Archivo 1: edades.html Lenguajes Interpretados en el Servidor 42 Guía # 3: Matrices y funciones en PHP <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Edades de personas</title> <link type="text/css" rel="stylesheet" media="screen" href="css/edades.css" /> <script type="text/javascript" src="js/agregar.js"></script> <script type="text/javascript" src="js/validatefield.js"></script> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <section> <article> <form name="frmedades" action="promedioedad.php" method="POST"> <fieldset> <legend><span>Edades de personas:</span></legend> <ul> <li> <label for="edad">Ingreso de edades:</label> <div class="campo"> <input type="text" name="edad" id="edad" maxlength="60" /> <input type="reset" name="agregar" id="agregar" value="Agregar" /><br /> <span id="numbersOnly">S&oacute;lo acepta n&uacute;meros.</span> </div> </li> <li> <label for="ingresados">Edades ingresadas:</label> <div class="campo"> <select name="ingresados[]" id="ingresados" size="6" multiple="multiple"></select> </div> </li> <li> <div class="campo"> <input type="submit" name="enviar" id="enviar" value="Enviar" class="boton" /> </div> </li> </ul> </fieldset> </form> </body> </article> </section> </html> Archivo 2: promedioedad.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <title>Productos de la tienda</title> <link type="text/css" rel="stylesheet" media="screen" href="css/edades.css" /> <script type="text/javascript" src="js/modernizr.custom.lis.js"></script> </head> <body> <section> <article> <table> <thead> <th class="head">Edades ingresadas</th> Lenguajes Interpretados en el Servidor 43 Guía # 3: Matrices y funciones en PHP </thead> <tbody> <?php if(isset($_POST['enviar'])){ if(isset($_POST['ingresados'])){ calcularedadprom($_POST['ingresados']); } else{ $msgerr = "No hay edades que procesar."; $edades = array($msgerr); calcularedadprom($edades); } } // Función para calcular el promedio de las edades function calcularedadprom($edades){ $promedades = 0; $contador = 0; $celdas = ""; foreach($edades as $edad){ $celdas .= "\n\t<tr>\n\t\t<td>\n\t\t\t$edad\n\t\t</td>\n\t</tr>\n</tbody>\n"; $promedades += $edad; $contador++; } $promedades /= $contador; $promedades = number_format($promedades, 2, ".", ","); $celdas .= "<tfoot>\n"; $celdas .= "<tr>\n\t\t<th>\n\t\t\tLa edad promedio es: $promedades\n\t\t</th>\n\t</tr>\n"; $celdas .= "</tfoot>\n"; echo $celdas; } ?> </table> </article> </section> </body> </html> Archivo 3: edades.css * { border:0; padding:0; } #numbersOnly { font:Bold 0.75em Arial,Helvetica,sans-serif; color:Gold; background-color:Red; visibility:hidden; display:block; } fieldset { width:46%; position:relative; margin-left:50%; left:-23%; background-color:rgb(190,220,230); border:6px ridge rgb(50,100,150); Lenguajes Interpretados en el Servidor 44 Guía # 3: Matrices y funciones en PHP } legend span { display:block; border:3px ridge rgb(50,100,150); background-color:rgb(20,20,100); font:bold 9pt "Century Gothic","Arial Rounded MT Bold",Helvetica,sans-serif; color:rgb(225,250,250); padding:2px 5px; } label { font:normal 9pt "Arial Rounded MT Bold","Century Gothic",Helvetica,sans-serif; color:rgb(30,60,100); display:block; float:left; width:30%; text-align:right; padding-top:0.6em; padding-bottom:0.6em; } .campo { width:68%; display:block; position:relative; float:right; } .boton { display:block; width:5em; margin-left:50%; left:-2.5em; bottom:-0.2em; position:relative; } ul { list-style-type:none; margin:0; padding:0; } li { line-height:2.1em; display:block; } table { width:18%; position:relative; margin-left:50%; left:-9%; border-collapse:collapse; border:8px groove rgb(100,10,5); } tr { border:1px solid rgb(120,20,20); } th { Lenguajes Interpretados en el Servidor 45 Guía # 3: Matrices y funciones en PHP background-color:rgb(90,5,3); font:bold 14pt Garamond,Helvetica,sans-serif; color:rgb(250,240,200); } td { background-color: rgb(250,240,200); color: rgb(100,10,10); font:normal 14pt Garamond,Helvetica,sans-serif; text-align: center; } Archivo 4: agregar.js function addEvent(obj, evType, fn){ if(obj.addEventListener){ obj.addEventListener(evType, fn, false); return true; } else if (obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else{ return false; } } function initForms(){ document.getElementById("agregar").onclick = function(){ addProducts(document.frmedades.ingresados, document.frmedades.edad.value); } document.getElementById("enviar").onclick = function(){ var contador = 0; for(var i=0; i<document.frmedades.ingresados.options.length; i++){ if(document.frmedades.ingresados.options[i].selected){ contador++; } } if(contador == 0){ alert("No se han seleccionado elementos."); return false; } } } function addProducts(optionMenu, value){ var posicion = optionMenu.length; optionMenu[posicion] = new Option(value, value); } addEvent(window, 'load', initForms); Archivo 5: validatefield.js function init(){ var inputtag = document.getElementById("edad"); (inputtag.addEventListener) ? inputtag.addEventListener("keypress", numbersOnly, false) : inputtag.onkeypress = numbersOnly; } // Este es el controlador keypress que filtra la entrada del usuario function numbersOnly(event) { // Obtener el objeto event y el código de carácter de la tecla pulsada Lenguajes Interpretados en el Servidor 46 Guía # 3: Matrices y funciones en PHP // de forma compatible con todos los navegadores var e = event || window.event; // Objeto de evento de la tecla var code = e.charCode || e.keyCode; // tecla que se ha pulsado // Si se ha pulsado una tecla de función de cualquier tipo, no filtrarla if(e.charCode == 0) return true; // Tecla de función (solo para Firefox) if(e.ctrlKey || e.altKey) return true; // Se mantienen presionadas Ctrl o Alt if(code < 32) return true; // Carácter de Ctrl en tabla ASCII // Dejar pasar teclas de retroceso (BackSpace), tabulación (Tab), entrada (Enter), // escape (Scape) y espacios en blanco (SpaceBar) if(code==0 || code==8 || code==9 || code==13 || code==27 || code==32) return true; // Buscar la información de los caracteres válidos para este campo de entrada var allowed = "0123456789"; // Caracteres válidos var messageElement = document.getElementById("numbersOnly"); // Mensaja a ocultar/mostrar // Convertir el código de carácter a su carácter correspondiente var c = String.fromCharCode(code); // Comprobar si el carácter está dentro del conjunto de caracteres permitidos if (allowed.indexOf(c) != -1) { // Si c es un carácter legal, ocultar el mensaje, si es que existe. if(messageElement) messageElement.style.visibility = "hidden"; return true; // Aceptar el carácter } else { // Si c no está en el conjunto de caracteres permitidos, mostrar el mensaje if(messageElement) messageElement.style.visibility = "visible"; // Y rechazar este evento keypress if(e.preventDefault) e.preventDefault(); if(e.returnValue) e.returnValue = false; return false; } } addEvent(window, 'load', init); Ejercicio #11: El siguiente ejemplo muestra cómo constuir una aplicación modular creando un sitio web en partes, primero con un archivo denominado header.php, luego el footer.inc.php y el archivo header.inc.php. Ambos archivos son integrados en home.php para armar la página principal de un sitio web. Esta técnica de construcción es llamada modularidad, ya que se utilizan archivos .inc.php Archivo 1: sitio.php <?php require('header.inc.php'); ?> <body> <div id="pagewrap"> <!-- #header y #nav --> <?php require('nav.inc.php'); ?> <!-- /#header y #nav --> <!-- #content --> <?php require('content.php'); ?> <!-- /#content --> <!-- #sidebar --> Lenguajes Interpretados en el Servidor 47 Guía # 3: Matrices y funciones en PHP <?php require('sidebar.php'); ?> <!-- /#sidebar --> <!-- #footer --> <?php require('footer.inc.php'); ?> <!-- /#footer --> Archivo 2: header.inc.php <!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width; initial-scale=1.0"> <title>Web adaptable con Media Queries</title> <!--css --> <link rel="stylesheet" type="text/css" href="css/style.css" /> <!-- <link href="media-queries.css" rel="stylesheet" type="text/css"> --> <!-- html5.js - IE 9 --> <!--[if lt IE 9]> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <!-- css3-mediaqueries.js - IE 9 --> <!--[if lt IE 9]> <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3mediaqueries.js"></script> <![endif]--> </head> Archivo 3: nav.inc.php <header id="header"> <hgroup> <img src="img/logo.png" id="logo" alt="logo" > <h1 id="site-description">Responsive Design con CSS3 Media Queries</h1> </hgroup> <nav> <ul id="main-nav" class="clearfix"> <?php $menuoptions = array("Home", "Quiénes somos", "Servicios", "Portafolio", "Blog", "Contacto"); $listitems = ""; foreach($menuoptions as $item): $listitems .= "\n<li>\n\n<a href=\"javascript:void(0);\">$item</a>\n</li>\n"; endforeach; echo $listitems; ?> </ul> </nav> <!-- nav --> <form id="searchform" action="javascript:void(0);"> <input id="s" placeholder="Search" type="search"> </form> </header> Archivo 4: content.php <div id="content"> <article class="post clearfix"> <h2 class="post-title"><a href="#">HTML5</a></h2> Lenguajes Interpretados en el Servidor 48 Guía # 3: Matrices y funciones en PHP <figure class="post-imagen"> <img src="img/html5-imagen.jpg"> </figure> <p> <strong>HTML5</strong> (<em><strong>H</strong>yper<strong>T</strong>ext <strong>M</strong>arkup <strong>L</strong>anguage</em>, versión 5) es la quinta revisión importante del lenguaje básico de la <a href="http://es.wikipedia.org/wiki/World_Wide_Web" title="World Wide Web">World Wide Web</a>, <a href="http://es.wikipedia.org/wiki/HTML" title="HTML">HTML</a>. HTML5 especifica dos variantes de sintaxis para HTML: un «clásico» HTML (text/html), la variante conocida como <em>HTML5</em> y una variante <a href="http://es.wikipedia.org/wiki/XHTML" title="XHTML">XHTML</a> conocida como sintaxis <em>XHTML5</em> que deberá ser servida como XML (XHTML) (application/xhtml+xml). <a href="http://es.wikipedia.org/wiki/HTML5#cite_note-w3cSpec-0">1</a> <a href="http://es.wikipedia.org/wiki/HTML5#cite_note-franganilloHTML5-1">2</a> Esta es la primera vez que HTML y XHTML se han desarrollado en paralelo. </p> <p> Todavía se encuentra en modo experimental, lo cual indica la misma W3C; aunque ya es usado por múltiples desarrolladores web por sus avances, mejoras y ventajas. </p> <p> Al no ser reconocido en viejas versiones de navegadores por sus nuevas etiquetas, se le recomienda al usuario común actualizar a la versión más nueva, para poder disfrutar de todo el potencial que provee HTML5. </p> </article> <article class="post clearfix"> <h2 class="post-title"><a href="#">CSS3</a></h2> <figure class="post-imagen"> <img src="img/css3-imagen.jpg"> </figure> <p> El nombre <strong>hojas de estilo en cascada</strong> viene del <a href="http://es.wikipedia.org/wiki/Idioma_ingl%C3%A9s" title="Idioma inglés">inglés</a> <em>Cascading Style Sheets</em>, del que toma sus siglas. CSS es un lenguaje usado para definir la presentación de un documento estructurado escrito en <a href="http://es.wikipedia.org/wiki/HTML" title="HTML">HTML</a> o <a href="http://es.wikipedia.org/wiki/XML" title="XML">XML</a> <a href="http://es.wikipedia.org/wiki/CSS3#cite_note-1">2</a> (y por extensión en <a href="http://es.wikipedia.org/wiki/XHTML" title="XHTML">XHTML</a>). </p> <p> El <a href="http://es.wikipedia.org/wiki/W3C" title="W3C">W3C</a> (World Wide Web Consortium) es el encargado de formular la especificación de las <a href="http://es.wikipedia.org/wiki/Hojas_de_estilo" title="Hojas de estilo">hojas de estilo</a> que servirán de estándar para los <a href="http://es.wikipedia.org/wiki/Agentes_de_usuario" title="Agentes de usuario">agentes de usuario</a> o <a href="http://es.wikipedia.org/wiki/Navegadores" title="Navegadores">navegadores</a>.<br> La idea que se encuentra detrás del desarrollo de CSS es separar la <em>estructura</em> de un documento de su <em>presentación</em>. Lenguajes Interpretados en el Servidor 49 Guía # 3: Matrices y funciones en PHP </p> </article> <!-- /.post --> </div> Archivo 5: sidebar.php <aside id="sidebar"> <section class="widget"> <h4 class="widgettitulo">Noticias</h4> <ul> <?php $submenuoptions = array( "Diseño Web", "Diseño Gráfico", "WordPress", "Joomla", "Drupal", "Redes Sociales", "SEO" ); $listsubmenu = ""; foreach($submenuoptions as $itemsub): $listsubmenu .= "\n<li>\n\n<a href=\"javascript:void(0);\">$itemsub</a>\n</li>\n"; endforeach; echo $listsubmenu; ?> </ul> </section> <section class="widget"> <h4 class="widgettitulo">Sitos Web</h4> <ul> <?php $externallinks = array( "http://www.tutosytips.com/" => "Tutosytips.com", "http://www.wordpress.org.com/" => "Wordpress", "http://www.Joomla.org/" => "Joomla", "http://www.twetter.com/" => "Twetter", "http://www.facebook.com/" => "Facebook", "http://www.youtube.com/" => "YouTube", "javascript:void(0);" => "SEO" ); $listext = ""; foreach($externallinks as $extlink => $extitem): $listext .= "\n<li>\n\n<a href=\"$extlink\">$extitem</a>\n</li>\n"; endforeach; echo $listext; ?> </ul> </section> </aside> Archivo 6: footer.inc.php <footer id="footer"> <p>Tutorial por <a href="http://tutosytips.com/">tutosytips</a></p> </footer> <!-- footer --> </div> <!-- /#pagewrap --> </body> </html> Lenguajes Interpretados en el Servidor 50 Guía # 3: Matrices y funciones en PHP Archivo 7: style.css /************************************************************************************ * Resetear estilos por defecto definidos por los navegadores * ************************************************************************************/ html, body, address, blockquote, div, dl, form, h1, h2, h3, h4, h5, h6, ol, p, pre, table, ul, dd, dt, li, tbody, td, tfoot, th, thead, tr, button, del, ins, map, object, a, abbr, acronym, b, bdo, big, br, cite, code, dfn, em, i, img, kbd, q, samp, small, span, strong, sub, sup, tt, var, legend, fieldset { margin: 0; padding: 0; } img, fieldset { border: 0; } img { max-width: 100%; height: auto; width: auto\9; /* ie8 */ } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; margin: 0; } /************************************************************************************ * ESTILOS GENERALES * ************************************************************************************/ body { /* background: #0d1424 url(../img/waves_bg.jpg) repeat center top; */ background: #0d1424 url(../img/bg-blue.jpg) repeat center top; font: .81em/150% Arial, Helvetica, sans-serif; color: #666; } a { color: #026acb; text-decoration: none; outline: none; } a:hover { text-decoration: underline; } p { margin: 0 0 1.2em; padding: 0; } /* list */ ul, ol { margin: 1em 0 1.4em 24px; padding: 0; line-height: 140%; } Lenguajes Interpretados en el Servidor 51 Guía # 3: Matrices y funciones en PHP li { margin: 0 0 .5em 0; padding: 0; } /* headings */ h1, h2, h3, h4, h5, h6 { line-height: 1.4em; margin: 20px 0 .4em; color: #000; } h1 { font-size: 2em; } h2 { font-size: 1.6em; } input[type=search] { -webkit-appearance: none; outline: none; } #pagewrap { width: 980px; margin: 0 auto; } #header { position: relative; height: 160px; } /* site description */ #site-description { color: #FFFFFF; left: 160px; position: absolute; top: 30px; } #searchform { position: absolute; right: 10px; bottom: 6px; z-index: 100; width: 160px; } #searchform #s { width: 140px; float: right; background: #fff; border: none; padding: 6px 10px; /* border radius */ -webkit-border-radius: 5px; -moz-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; border-radius: 5px; Lenguajes Interpretados en el Servidor 52 Guía # 3: Matrices y funciones en PHP behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.2); -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.2); box-shadow: inset 0 1px 2px rgba(0,0,0,.2); /* transition */ -webkit-transition: width .7s; -moz-transition: width .7s; transition: width .7s; } #main-nav { width: 100%; background: #ccc; margin: 0; padding: 0; position: absolute; left: 0; bottom: 0; z-index: 100; /* gradient */ background: #6a6a6a url(../img/nav-bar-bg.png) repeat-x; background: -webkit-gradient(linear, left top, left bottom, from(#b9b9b9), to(#6a6a6a)); background: -moz-linear-gradient(top, #b9b9b9, #6a6a6a); background: linear-gradient(-90deg, #b9b9b9, #6a6a6a); /* rounded corner */ -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 1px rgba(0,0,0,.4); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 1px rgba(0,0,0,.4); box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 1px rgba(0,0,0,.4); } #main-nav li { margin: 0; padding: 0; list-style: none; float: left; position: relative; } #main-nav li:first-child { margin-left: 10px; } #main-nav a { line-height: 100%; font-weight: bold; color: #fff; display: block; padding: 14px 15px; text-decoration: none; text-shadow: 0 -1px 0 rgba(0,0,0,.5); } #main-nav a:hover { color: #fff; Lenguajes Interpretados en el Servidor 53 Guía # 3: Matrices y funciones en PHP background: /* gradient background: to(#797979)); background: background: #474747; */ -webkit-gradient(linear, left top, left -moz-linear-gradient(top, #cdcdcd, #797979); linear-gradient(-90deg, #cdcdcd, #797979); } #content { background: #fff; margin: 30px 0 30px; padding: 20px 35px; width: 600px; float: left; /* rounded corner */ -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.4); -moz-box-shadow: 0 1px 3px rgba(0,0,0,.4); box-shadow: 0 1px 3px rgba(0,0,0,.4); } h2.post-title { background: #888; -moz-border-radius: 5px; -webkit-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; border-radius: 5px; behavior: url(htc/border-radius.htc); padding: 0px 5px ; border-top: 1px solid #889; border-bottom: 1px solid #889; text-align: center; } h2.post-title a { color: #FFFFFF; font-size: 0.9em; text-shadow: 1px 1px 2px #333333; } .post { margin-bottom: 20px; } .post-title { margin: 0 0 5px; padding: 0; font: bold 26px/120% Arial, Helvetica, sans-serif; } .post-title a { text-decoration: none; color: #000; } Lenguajes Interpretados en el Servidor 54 bottom, from(#cdcdcd), Guía # 3: Matrices y funciones en PHP .post-meta { margin: 0 0 10px; font-size: 90%; } figure.post-imagen img { float: left; margin: 5px; max-width: 260px; } #sidebar { width: 280px; float: right; margin: 30px 0 30px; } .widget { background: #402c80; margin: 0 0 30px; padding: 10px 20px; /* rounded corner */ -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px; behavior: url(htc/border-radius.htc); /* box shadow */ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.4); -moz-box-shadow: 0 1px 3px rgba(0,0,0,.4); box-shadow: 0 1px 3px rgba(0,0,0,.4); } .widgettitulo { background: none repeat scroll 0 0 #9f7ce9; border-radius: 5px 5px 5px 5px; -moz-border-radius: 5px 5px 5px 5px; -webkit-border-radius: 5px 5px 5px 5px; -o-border-radius: 5px 5px 5px 5px; -ms-border-radius: 5px 5px 5px 5px; behavior: url(htc/border-radius.htc); color: #FFFFFF; margin: 0 0 5px; padding: 6px 0; text-align: center; } .widget ul { margin: 0; padding: 0; } .widget li { margin: 0; padding: 2px 0; list-style: none; clear: both; border-top: solid 1px #eee; } section.widget ul li a { color: #fff; Lenguajes Interpretados en el Servidor 55 Guía # 3: Matrices y funciones en PHP font-weight: bold; font-style: italic; font-size: 1em; padding: 11px; display: block; -webkit-transition: all 0.4s ease; -moz-transition: all 0.4s ease; transition: all 0.4s ease-out; } section.widget ul li a:hover { background: #fff; color: #6B6B6B !important; text-decoration: none; } /*---FOOTER---*/ #footer { background: none repeat scroll 0 0 #999999; -moz-border-radius: 5px 5px 5px 5px; -webkit-border-radius: 5px 5px 5px 5px; -o-border-radius: 5px 5px 5px 5px; -ms-border-radius: 5px 5px 5px 5px; border-radius: 5px 5px 5px 5px; behavior: url(htc/border-radius.htc); clear: both; color: #333333; font-size: 90%; text-align: center; } #footer a { color: #fff; } .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } .clearfix { display: inline-block; } .clearfix { display: block; zoom: 1; } /**************************************************** * CONDICIONALES DE MEDIA QUERIES * ****************************************************/ @media screen and (max-width: 980px) { #pagewrap { width: 95%; } #content { width: 60%; padding: 3% 4%; Lenguajes Interpretados en el Servidor 56 Guía # 3: Matrices y funciones en PHP } figure.post-imagen img { float: left; margin: 5px; max-width: 230px; } #sidebar { width: 30%; } #sidebar .widget { padding: 8% 7%; margin-bottom: 10px; } } @media screen and (max-width: 650px) { #header { height: auto; } #searchform { position: absolute; top: 5px; right: 0; z-index: 100; height: 40px; } #searchform #s { width: 70px; } #searchform #s:focus { width: 150px; } #main-nav { position: static; } #site-logo { margin: 15px 100px 5px 0; position: static; } /* site description */ #site-description { margin: 0 0 15px; position: static; text-align: center; } #content { width: auto; float: none; margin: 20px 0; } figure.post-imagen img { float: left; margin: 5px; max-width: 180px; } #sidebar { width: 100%; margin: 0; float: none; } #sidebar .widget { padding: 3% 4%; Lenguajes Interpretados en el Servidor 57 Guía # 3: Matrices y funciones en PHP margin: 0 0 10px; } } @media screen and (max-width: 480px) { html { -webkit-text-size-adjust: none; } #main-nav a { font-size: 90%; padding: 10px 8px; } figure.post-imagen img { float: left; margin: 5px; max-width: 130px; } } V. DISCUSION DE RESULTADOS 1. Realice un script PHP que dadas tres notas de un listado de estudiantes organizadas en una matriz asociativa, le permita obtener el promedio de ellas sabiendo que las notas son de una tarea, una investigación y el examen parcial con la ponderación de 50%, 30% y 20% respectivamente. Por último, muestre las notas promediadas de cada alumno en una tabla bien presentable, mostrando el nombre del alumno, la nota que tiene en cada actividad y en una celda combinada su promedio. SUGERENCIA: Haga una matriz con la siguiente estructura para facilitar el proceso: $notas = array( "nombre Alumno1" => array( "Parcial" => 9.1, "Tarea" => 0 ), … 2. Realice un script PHP que utilice una función para que dada una lista de números enteros ingresada por el usuario (como mínimo 2 números) permita encontrar el número mayor y menor de dicha lista utilizando dos funciones con lista variable de argumentos, una para encontrar el número mayor y otra para encontrar el número menor. La solución debe permitir visualizar la lista de números ingresados e indicar cuáles han sido el número mayor y el número menor encontrados por sus funciones. 3. Haciendo uso de la modularidad descrita en el ejemplo 11 del procedimiento, cree una página web que incluya un archivo PHP para la sección head de la página que incluya la Definición de Tipo de Documento, otro para la sección footer, el menú de navegación principal, la sección content y la sección sidebar. Tiene que tomar un diseño distinto del que se mostró en el ejemplo. Puede ser la misma distribución en las mismas posiciones, pero tiene que utilizar una hoja de estilo diferente. VI. INVESTIGACIÓN COMPLEMENTARIA 1. Investigue la utilización de las funciones include_once() y require_once() e indique la diferencia o diferencias que tienen con respecto a sus homólogas include() y require(). Lenguajes Interpretados en el Servidor 58 Guía # 3: Matrices y funciones en PHP VII. BIBLIOGRAFIA Gil Rubio, Francisco Javier/Villaverde, Santiago Alonso/Tejedor Cerbel, Jorge A. Creación de sitios web con PHP 5. Editorial McGraw-Hill. 1ra edición. Madrid, España, 2006. Gutiérrez, Abraham / Bravo, Ginés. PHP 5 a través de ejemplos. Editorial Alfaomega RAMA. 1ª edición. Junio 2005. México. John Coggeshall. La Biblia de PHP 5. Editorial Anaya Multimedia. Madrid España. 1ª edición. Madrid, España. Michele E. Davis / John A. Phillips. Creación de sitios web dinámicos con PHP y MySQL. Editorial Anaya Multimedia / O’Reilly. 1ª edición. Madrid, España. http://www.php.net/manual/es Lenguajes Interpretados en el Servidor 59