Blog

16 de marzo de 2010

Un código elegante

2 En total

Quiero presentarles este pequeño y elegante código en PHP que encontré por ahí:

function file_size($size)
{
 $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
 return $size ? round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
}

¿Qué hace?

Es una función que devuelve en un formato fácil de leer, un número muy grande de bytes. Así, en vez de tener que escribir algo como 18743798643 bytes, podríamos hacerlo como 17.45 GB. Mucho más fácil de leer y entender de un vistazo.

Convertir un número de bytes en los respectivos kilobytes, megabytes o gigabytes tiene sus inconvenientes. A diferencia de lo que indican sus prefijos, dichas unidades no son múltiplos de mil. En realidad lo son de 1024, tal que 1024 bytes = 1 kilobyte, 1024 kilobytes = 1 megabyte, etc.

Para encontrar la escritura simplificada de un número de bytes cualquiera, podríamos evaluar progresivamente dicha cantidad hasta averiguar la potencia de 1024 que es más adecuada a su magnitud. Sin embargo, hacerlo así demanda muchas sentencias condicionales, resultando poco versátil. La función mostrada arriba es mucho más elegante, pues utiliza solo una sentencia condicional.

¿Qué la hace bella?

Su simpleza, minimalismo y versatilidad. Todo ello, gracias a los conocimientos que su autor tiene de los logaritmos, las potencias y el lenguaje PHP.

Si aún no me creen, consideren una alternativa:

function ByteSize($bytes){
 $size = $bytes / 1024;
 if($size < 1024)
 {
  $size = number_format($size, 2);
  $size .= ' KB';
 }
 else
 {
  if($size / 1024 < 1024)
  {
   $size = number_format($size / 1024, 2);
   $size .= ' MB';
  }
  else if ($size / 1024 / 1024 < 1024)
  {
  $size = number_format($size / 1024 / 1024, 2);
  $size .= ' GB';
  }
 }
 return $size;
}

¿Cómo funciona la versión más elegante?

Se acepta como parámetro la variable $size, que almacena el tamaño en bytes que deseamos hacer más legible. Se asume que es entero positivo o cero.

Si $size es igual a cero, se regresa automáticamente la cadena 0 bytes. En cualquier otro caso se prosigue como sigue:

Se define un arreglo llamado $filesizename, que almacena los sufijos asociados a las potencias de 1024 bytes. El índice del arreglo asignado a cada sufijo se corresponde con la potencia de 1024 que dicho sufijo representa.

Para encontrar la potencia de 1024 llamada $i, que nos permitirá elegir el sufijo adecuado, se realiza lo siguiente:

Se calcula el logaritmo base 1024 de $size (que nos regresa la potencia a la que debe elevarse 1024 para obtener dicho valor). Este resultado es truncado para eliminar las partes no enteras.

Este nuevo valor de $i se utilizará como exponente de una función pow(), que elevará el número 1024 a dicha potencia, a fin de construir la siguiente expresión:

$size/pow(1024, $i)

Esta división dará como resultado el tamaño en $filesizename[$i] de $size.

Es todo. Tan solo resta concatenar el número obtenido al sufijo correspondiente.

¡Voila!

Categorías: :: Enlace permanente
Compartir:  Facebook  Del.icio.us  Technorati  Twitter

2 Comentario(s)

Escépticos-SKP
17 marzo 2010, 02:14

Vínculo al comentario

Creí que ya te habias ido, esta página parecia desierto. Que bien que volviste a postear, espero que no desparescas de nuevo.

Escépticos-SKP
275 A.C.

Javier
17 marzo 2010, 06:30

Vínculo al comentario

También lo espero.

Han pasado más de 6 semanas desde su publicación, por tal motivo se han cerrado los comentarios a este artículo.

Frase aleatoria

No puedo creer en el Dios de mis padres. Si hay una Mente que comprende todas las cosas, me comprenderá en mi descreimiento.

Gerald Kersh

Yo

Su anfitrión

Nací y todavía no he muerto. Matemático metido a otra cosa.

Twitter

Licencia

CC

Salvo que se indique lo contrario, el contenido del sitio está bajo una licencia de Creative Commons.

Atheist

Comentarios recientes

Últimas entradas

Acerca de Escéptica.net

Es el blog personal de Javier Garduño C., donde da cabida a sus ideas y setimientos. ¿Para qué otra cosa sería un blog?