PHP-TUT-12 Manejo de datos (y II)

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

En el artículo anterior hemos aprendido sobre cadenas de texto en PHP. Aquí vamos a aprender a manejarnos con números y, lo que es, en muchos casos, más engorroso, con fechas.

FUNCIONES NUMÉRICAS

PHP proporciona una buena librería de funciones para la gestión de valores numéricos. En este apartado vamos a conocer las más importantes por su utilidad. Quizás una de las capacidades matemáticas que más llamativa resulte a quienes estudian un nuevo lenguaje es la de generar números aleatorios. PHP resuelve esto muy bien, mediante la función rand(). En su uso más básico no recibe ningún argumento y genera un número aleatorio entero. El uso más básico responde a la siguiente sintaxis:

$aleatorio = rand();

El número aleatorio está comprendido entre 0 y MAX_RAND, que es un parámetro propio de PHP que determina el valor máximo que podrá tener un número aleatorio. Para obtener el valor de MAX_RAND usaremos la función getmaxrand(), sin ningún argumento. También puede darse el caso de que queramos que el número aleatorio a obtener se encuentre entre dos límites, x e y. En ese caso le pasaremos los límites como argumentos a la función rand(). La sintaxis sería la siguiente:

$aleatorio = rand ($x, $y);

Observa el script aleatorio.php:

Observa en las líneas resaltadas los dos usos posibles de rand(). Este script podría dar un resultado similar al siguiente:

Valor de MAX_RAND: 32767
Número aleatorio sin parámetros: 11667
Número aleatorio entre 0 y 10: 8

Otra función muy empleada es sqrt(), cuyo uso es obtener la raíz cuadrada del valor que recibe como argumento. La sintaxis general es la siguiente:

$raiz = sqrt ($valor);

Para el cálculo trigonométrico, PHP cuenta con varias funciones:

  • La función sin() recibe un argumento que representa a un ángulo y devuelve el seno del mismo.
  • La función cos() recibe un ángulo y devuelve su coseno.
  • La función tan() recibe un ángulo y devuelve su tangente.
  • La función asin() recibe un ángulo y devuelve su arco seno.
  • La función acos() recibe un ángulo y devuelve su arco coseno.
  • Por último, la función atan() recibe un ángulo y devuelve su arco tangente.

Estas funciones son similares a las de otros lenguajes, pero los ángulos que reciben como argumento deben ir expresados en radianes. A tal fin, PHP cuenta condos funciones:

  • La función deg2rad(), que recibe un ángulo expresado en grados y lo devuelve en radianes.
  • La función inversa, rad2deg(), que recibe un ángulo expresado en radianes y lo devuelve en grados.

Observa el script trigonometricas.php:

Tabla de resultados de trigonometría.

Tabla de resultados de trigonometría.

Fíjate en el uso que hacemos de las funciones explicadas en la zona del código que aparece resaltada. El resto sólo es una tabla de XHTML para mostrar los resultados, integrando las variables de PHP como ya sabemos hacerlo de ejercicios anteriores. El resultado final puedes verlo en la imagen que hay a la izquierda.

Otro grupo de funciones que nos interesa conocer son aquellas destinadas a manejar logaritmos:

  • La función log() devuelve el logaritmo natural del valor que recibe como argumento.
  • La función log10() devuelve el logaritmo en base 10 del valor que recibe como argumento.
  • La función exp() recibe un valor como argumento y devuelve el número e (base de los logaritmos neperianos, cuyo valor es 2.718281828459) elevado a dicho argumento.

Mira el script reproducido a continuación, llamado logaritmos.php:

El resultado que obtenemos en la página es el siguiente:

Partimos del valor: 4
El logaritmo natural es: 1.3862943611199
El logaritmo en base 10 es: 0.60205999132796
El número "e" elevado a 4 es: 54.598150033144

Un aspecto importante de la gestión de valores numéricos es el uso de distintas bases de numeración. Las más importantes, dentro del área de la informática, aparte de la decimal (base 10), son la hexadecimal (base 16), la octal (base 8) y la binaria (base 2). En ocasiones es preciso convertir un número en una determinada base a otra, para un uso concreto. PHP nos proporciona algunas funciones útiles en este menester.

  • La función bindec() recibe como argumento una cadena compuesta por ceros y unos que representa a un valor binario y devuelve el correspondiente valor en decimal.
  • La función hexdec() recibe una cadena que representa un valor hexadecimal (compuesta, por tanto, por los dígitos del 0 al 9 y las letras de la A a la F). Devuelve el correspondiente valor decimal.
  • La función octdec() recibe como argumento una cadena que representa un valor octal (compuesta por dígitos del 0 al 7) y devuelve el correspondiente valor decimal. Por supuesto, también contamos con las funciones inversas.
  • La función decbin() recibe un número decimal y devuelve una cadena formada por ceros y unos que representa al argumento en binario.
  • La función dechex() recibe un número decimal y devuelve una cadena que representa a dicho número en hexadecimal.
  • La función decoct() recibe un número en decimal y devuelve una cadena que representa a dicho número en octal.

Quiero llamar tu atención respecto a un punto concreto del uso de estas funciones: exceptuando los valores en decimal, que son numéricos, todos los valores en otras bases están representados mediante cadenas alfanuméricas. Así pues, un valor binario podrá ser "1101001101", no 1101001101.

También podemos convertir un número directamente entre dos bases cualesquiera mediante el uso de la función base_convert(). Esta función recibe tres argumentos separados mediante comas. El primero es una cadena alfanumérica que representa el valor original que queremos convertir, el segundo argumento en un número que indica la base en la que está dicho valor y el tercer parámetro es otro número, para indicar la base a la que queremos convertir dicho valor. Esta función puede manejar cualquier base entre 2 (binario) y 36. Por ejemplo, si quisiéramos convertir el valor "A4D2FF" hexadecimal a binario usaríamos una sentencia similar a la siguiente:

$valorBinario = base_convert ("A4D2FF", 16, 2);

Si recuerdas, ya comentábamos estas funciones y lo necesario acerca de bases de numeración en un artículo anterior. Esto es sólo un recordatorio.

Uno de los valores más manejados cuando de geometría se trata es PI que, como sabes, representa la relación entre la longitud de una circunferencia y su diámetro, y es constante. Su valor aproximado es 3.1415926535898. PHP nos proporciona una constante que contiene ese valor, para que no tengamos que teclearlo cuando lo necesitemos. Se trata de M_PI. También podemos obtener este valor mediante el uso de la función pi(), que no requiere de argumentos. Observa las siguientes líneas:

echo "El valor de pi es ".M_PI."<br />";
echo "Otra vez. El valor de pi es ".pi()."<br />";

El resultado será el siguiente:

El valor de pi es 3.1415926535898
Otra vez. El valor de pi es 3.1415926535898

A menudo nos encontramos con la necesidad de redondear un número fraccionario. PHP nos ofrece tres funciones que cumplen esta finalidad, cada una de una manera diferente.

  • La función ceil(), que recibe un número fraccionario y lo redondea al entero inmediato superior.
  • La función floor(), que recibe como argumento un número fraccionario y lo redondea al inmediato entero inferior.
  • La función round(). Esta función recibe un número fraccionario. Si la parte fraccionaria es inferior a 5, el redondeo se hace al inmediato entero inferior. Si la parte fraccionaria es 5 o mayor, el redondeo se hace al inmediato entero superior.

PHP cuenta con dos funciones muy útiles para determinar cuál es el mayor y cuál el menor de un conjunto de valores. Las funciones max() y min() han sido implementadas a estos efectos. Pueden recibir un número ilimitado de argumentos, separados por comas. Por ejemplo, supongamos el siguiente fragmento de código:

$valor_1 = 14;
$valor_2 = 20;
$valor_3 = 30;

$mayor=max ($valor_1, $valor_2, $valor_3);
$menor=min ($valor_1, $valor_2, $valor_3);

Esto hará que en la variable $mayor se almacene el valor 30 y en la variable $menor se almacene el valor 14.

Además, cualquiera de los argumentos puede ser una matriz que contenga, a su vez, varios valores. En ese caso, la función max() considerará en el lugar de ese argumento el mayor elemento de la matriz. La función min(), por el contrario, considerará ese argumento como el elemento de menor valor de la matriz.

En PHP contamos también con una función destinada a la potenciación (exponenciación) de valores numéricos. Se trata de pow(), que recibe dos argumentos numéricos separados por una coma. El primero es la base y el segundo es el exponente al que queremos elevar la base. Así, por ejemplo, el número 84, al cubo, será:

$resultado = pow (84,3);

Esta sentencia almacenará, en la variable $resultado, el valor 592704, que se obtiene al realizar la operación aritmética indicada.

No quiero terminar este apartado sin tocar un tema que, a menudo, necesitarás en tus páginas. Para dar un formato específico a valores numéricos al mostrarlos en la página podemos usar la función number_format(). Esta función recibe cuatro argumentos, de los cuales sólo el primero es obligatorio. Los demás son opcionales. Éstos son:

  • El valor que es necesario presentar formateado (o el nombre de la variable que contiene dicho valor).
  • El número de cifras decimales que queremos mostrar (por defecto, ninguno).
  • El carácter que vamos a emplear como separador de los decimales (por defecto, el punto).
  • El carácter que vamos a emplear como separador de miles (por defecto, la coma).

Veamos un ejemplo sencillo en el script formatearNumero.php:

El resultado que vemos en la página es:

123,456,790

Observa que, al no haber establecido ninguna posición decimal, se ha producido un efecto de redondeo. Como la parte fraccionaria es superior a 5 décimas, el susodicho redondeo se ha producido hacia arriba. Ahora hagamos una prueba, sustituyendo el separador de miles por un punto, poniendo un coma para separar la parte entera de la fraccionaria y estableciendo dos cifras decimales. Lo tienes en el script formatearNumeroTotal.php:

El resultado que vemos en la página es:

123.456.789,99

Observa el efecto de redondeo que se ha producido en los decimales. Al establecer sólo dos decimales, mientras que el valor original tiene más, se redondea.

MANEJANDO FECHAS

Uno de los datos que más a menudo podemos llegar a manejar en una aplicación cliente-servidor es la fecha y hora del sistema. Piensa en lo importante que puede llegar a ser este tipo de información, a fin de determinar cuándo se dio de alta un abonado en su sitio web, o la fecha de una compra si montas una tienda virtual, o cuándo fue la última visita de un usuario a fin de enviarle un e-mail con un saludo comercial, etc. En este apartado vamos a conocer algunas funciones destinadas a recuperar la fecha y hora del sistema y extraer determinadas partes de esa información. Por ejemplo, es probable que sólo necesites, para un proceso determinado, el día y el mes, pero no el año, la hora ni los minutos.

ATENCIÓN. En el momento de trabajar con la fecha y hora del sistema hay algo importante que no debes olvidar: recuerda siempre que trabajarás con la fecha y hora del servidor, no de tu equipo local. De momento, es la misma, porque estás trabajando sobre una plataforma servidora montada en tu propio equipo. Pero, en su momento, subirás su sitio a un servidor de acceso público para que esté disponible para todo el mundo. Ése es el objetivo de Internet. También puede ser que coloques las páginas de tu sitio en un servidor privado para la red local de una empresa, por ejemplo, si desarrollas una aplicación cliente servidor específica para dicha organización. En todo caso los scripts de PHP que uses se ejecutarán en el lado del servidor y, por lo tanto, cuando hagan uso de la fecha y hora del sistema, será la del servidor, no la del usuario que se conecta a tu aplicación. Esto tiene una ventaja importante: da lo mismo que el ordenador cliente no tenga la fecha correcta. Cuando el script toma la fecha es la del servidor, por lo que, si ésta está correctamente ajustada, la aplicación funcionará con datos válidos. En cambio, si tu aplicación necesita, por cualquier razón, la fecha y hora del ordenador cliente tendrá que obtener estos datos mediante JavaScript.

Un detalle importante es que la fecha de un ordenador no es absoluta. Aunque tú la veas como tal en tu entorno de trabajo, la fecha es lo que se conoce como marca de tiempo o timestamp. La timestamp es la diferencia, en segundos, entre el momento actual y lo que se conoce como comienzo de la era Unix: la hora 00:00:00 GMT (es decir, del meridiano 0 o de Greenwich) del día 1 de Enero de 1970. Es el momento cero para la informática, tal como la conocemos hoy. Como es lógico, la timestamp no nos sirve de gran cosa, por mucha importancia que, como efemérides, le demos a la hora cero. Sin embargo, PHP cuenta con funciones que nos pueden dar la fecha y hora reales.

En primer lugar, vamos a conocer la forma de recuperar la timestamp actual. Para ello, contamos con la función time(), cuyo uso vemos en el listado del script marcaDeTiempo.php:

Cuando he ejecutado este script en mi navegador he obtenido lo siguiente:

1463811923

Como es lógico, cuando tú lo ejecutes obtendrás un resultado mayor, ya que mayor será la timestamp.

Sin embargo, a nosotros nos interesa poder trabajar con las fechas y horas de una manera más práctica, lo que quiere decir más parecida al modo habitual de manejo de estos datos en la vida real. Para ello contamos con la función getdate(), que nos devuelve una matriz asociativa con todos los datos que podamos necesitar sobre la fecha y hora del sistema. Observa el script datosDeFecha.php:

Los datos de la fecha actual.

Los datos de la fecha actual.

Cuando ejecutes este script verás que obtienes una relación de pares clave-valor muy amplia, que contempla todos los datos que podamos necesitar obtener de una fecha. Incluso contamos con el día de la semana en nombre y en número, el número de días transcurridos del año actual, etc. De aquí podemos obtener cualquier dato que necesitemos acerca de la fecha y hora del servidor en el momento de la ejecución. Incluso contamos con una clave, de nombre "0", que contiene la marca de tiempo.

Observe la imagen de la izquierda, donde se aprecia la lista de claves y valores que contiene la matriz obtenida mediante getdate(). Lógicamente tus datos, al ejecutar el script, serán los de la fecha y hora de tu máquina servidora.

Puedes obtener, mediante getdate() los datos de la fecha correspondiente a una determinada marca de tiempo, pasando dicha marca como argumento a la función.

Existe un modo más práctico de obtener la fecha del sistema en un momento dado. La función date() permite obtener la fecha y/o la hora en un formato que convenga a nuestros intereses. Para ello le tenemos que pasar, como argumento, una cadena con dicho formato expresado mediante unas claves predefinidas. Veamos un ejemplo de su uso, antes de entrar en detalles acerca del formato, en el script fechaHoy.php:

Al ejecutar este script en el navegador obtenemos el resultado siguiente:

La fecha de hoy es: 21/05/2016

Podemos configurar la cadena de formato para obtener la fecha y/o la hora tal como convenga a nuestros intereses, según la tabla siguiente:

CLAVE FORMATO
d Día del mes, con dos dígitos, es decir, de “01” a “31”.
j El día del mes, con un dígito o dos, según proceda (de “1” a “31”).
M El nombre del mes en curso, abreviado con tres letras, a partir del nombre en inglés. Por ejemplo, en agosto, aparecerá “Aug”.
m El mes en curso, en formato de “01” a “12”.
n El mes en curso, en formato de “1” a “12”.
F Nombre completo del mes, en inglés.
Y El año en curso con cuatro cifras. Por ejemplo, “2016”.
y El año en curso, representado con las dos últimas cifras. Por ejemplo, “16” si estamos en el año 2016.
D Abreviatura con tres letras del nombre del día de la semana, en inglés. Si, por ejemplo, es viernes, aparecerá “Fri”.
l El nombre del día de la semana completo, en inglés.
L Un “0” si el año no es bisiesto y un “1” si lo es.
t Número de días del mes en curso en formato de “28” a “31”.
z Día del año. De “0” a “364” (de “0” a “365”, si es bisiesto).
w Número del día de la semana. Tenga en cuenta que empieza por el domingo, con el valor “0” y acaba el sábado con el valor “6”.
h La hora en formato de “01” a “12”.
H La hora en formato de “00” a “23”.
g La hora en formato de “1” a “12”.
G La hora en formato de “0” a “23”.
i Los minutos en formato de “00” a “59”.
s Los segundos en formato de “00” a “59”.
A En la hora aparecerá la secuencia “A.M.” o “P.M”, según sea por la mañana o por la tarde.
a En la hora aparecerá la secuencia “a.m.” o “p.m”, según sea por la mañana o por la tarde.
S Cadena de dos caracteres con el sufijo ordinal en inglés. Por ejemplo, “st”, “nd”, “rd” o “th”.
Z La diferencia, en segundos, con respecto a la hora GMT.
U La marca de tiempo.

 La lista de posibles formatos está ordenada empezando por los formatos relativos a fechas, siguiendo por los que se refieren a las horas y, para finalizar, tres formatos especiales (S, Z y U) que permiten extraer información adicional de la función date(). Además de los formatos especificados, puedes añadir caracteres especiales para que aparezcan en el resultado de la función. Observa la sintaxis empleada en fechaHoy.php y ves que contiene unas barras inclinadas para separar el día del mes, y éste del año. Fíjate en que esas barras aparecen en el resultado. Puedes añadir otros caracteres, si lo necesitas para su diseño. Por ejemplo, si quisieras obtener la hora usando el signo de dos puntos (:) para separar las horas de los minutos y éstos de los segundos, podrías usar el siguiente formato: "H:i:s".

También contamos con la función gmdate(), que funciona de modo similar a date(), pero devolviendo la hora del meridiano de Greenwich (meridiano cero), es decir, con independencia de la hora que tenga el sistema servidor.

Estas funciones son bastante útiles y, si te dedicas al desarrollo de aplicaciones web, las emplearás mucho en tu vida profesional. Sin embargo, adolecen de una pequeña limitación: las referencias a los nombres de los meses y de los días de la semana están en inglés. Si bien esto no debe suponer un problema para quien trabaja en programación, ya que este idioma es universal para la informática, nuestras aplicaciones web estarán diseñadas para usuarios que no necesariamente se tienen por qué sentir cómodos con el uso de terminología anglosajona. Lo que pretendemos es recuperar los nombres de meses y días de la semana en el idioma de los usuarios a los que vaya destinado potencialmente nuestro trabajo. Para ello contamos con dos funciones que debemos conocer. La primera de ellas es setlocale(), que permite establecer en el servidor la configuración relativa a un idioma determinado. Esta función recibe dos argumentos separados por una coma. El primero estipula respecto a qué factores queremos establecer una configuración local y el segundo determina respecto a qué idioma queremos establecer dicha configuración. El primer argumento es una constante de PHP, a elegir de entre las siguientes:

  • LC_CTYPE que se refiere a la conversión de cadenas.
  • LC_NUMERIC que se refiere a la conversión de valores numéricos.
  • LC_TIME que se refiere a la conversión de fechas y horas.
  • LC_ALL que se refiere a todas las anteriores (en general, use ésta siempre).

El segundo parámetro es una cadena que representa el idioma que queremos para la configuración local de nuestro servidor. Por ejemplo, pondremos "esp" para español. En general, pondremos las dos primeras letras del nombre en inglés del idioma que queremos. Para fijar la configuración en español usaremos:

setlocale (LC_ALL, "esp");

Las claves para distintos idomas las puedes ver en este enlace.

Una vez establecida la configuración local usaremos otra función para obtener la fecha y/o la hora del sistema. Se trata de strftime(), que recibe un argumento con el formato en que queremos recuperar los datos necesarios. La mecánica es similar a la función date(), pero las cadenas relativas a los formatos son diferentes. Aparecen en la tabla representada a continuación:

CLAVE FORMATO
%a Abreviatura del nombre del día de la semana en el idioma establecido.
%A Nombre completo del día de la semana en el idioma establecido.
%b Abreviatura del nombre del mes en el idioma establecido.
%B Nombre del mes en el idioma establecido.
%c Fecha y hora presentadas según las convenciones del idioma establecido.
%d Día del mes en formato de “01” a “31”.
%H Hora en formato de “00” a “23”.
%I Hora en formato de “01” a “12”.
%j Día del año en formato de “001” a “366”.
%m Mes en formato de “01” a “12”.
%M Minutos en formato de “00” a “59”.
%p Las cadenas “a.m.” o “p.m.” (o sus equivalentes en el idioma establecido).
%S Segundos, de “00” a “59”.
%U Número de la semana del año. Tenga en cuenta que la primera semana del año en curso se cuenta a partir del primer domingo.
%w Día de la semana en número, 0 para el domingo, 6 para el sábado.
%x La fecha, sin la hora.
%X La hora, sin la fecha.
%y Los dos últimos dígitos del año en curso.
%Y El año en curso, con cuatro dígitos.
%z Nombre o abreviatura de la zona horaria.

Como ves, todos los posibles formatos van precedidos por el signo %. Veamos un ejemplo del uso de estas dos funciones en el script ajusteLocal.php:

El resultado será similar a lo siguiente:

sábado, 21 de mayo de 2016

Para terminar este artículo vamos a conocer la función checkdate(), que se emplea para determinar si una fecha es correcta o no. Esto viene al caso cuando la fecha la introduce un usuario en un formulario. Imagina que el usuario, por error, introduce 30 de febrero. Lo normal es que, a partir de que nuestro script empiece a trabajar con esta fecha, se produzcan errores o la aplicación no devuelva los resultados esperados. Veamos cómo esta función puede ayudarnos a evitar problemas. Le pasaremos tres parámetros numéricos, que representarán el mes, el día y el año de la fecha que queremos comprobar. Si es correcta, la función nos devolverá un valor lógico true. Si no lo es, nos devolverá un false. La sintaxis podría ser similar a la siguiente:

$dia = 30;
$mes = 2;
$anio = 2003;
if (checkdate($mes, $dia, $anio)){
        echo "es correcta.<br />";
} else {
        echo "NO es correcta.<br />";
}

Observa el uso de la función checkdate(). El resultado que vemos en la página es el siguiente:

La fecha 30/2/2003 NO es correcta.

Esta función será de mucha utilidad cuando use las fechas que pueda introducir el usuario para trabajar con bases de datos, hacer cálculos de edades, etc.

IMPORTANTE. En este artículo hemos aprendido el manejo “formal” de funciones de fecha. Sin embargo, trabajar con fechas en proyectos reales implica resolver necesidades que no siempre es fácil con las funciones que hemos visto aquí. Te recomiendo que le eches un vistazo a este artículo, que te amplia la información necesaria, y te ayudará (espero) en más de una ocasión.
     

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *