Archive for junio, 2009

junio 22, 2009 10

¿Cuál es el mejor método para recorrer un array en PHP?

By in PHP

Hace poco leí este interesante artículo: “for reverso para grandes iteraciones en JavaScript”. Hoy, mientras viajaba en metro de camino a casa, he pensado que sería interesante ver si esto ocurre también PHP. Para ello he usado la herramienta que comenté ayer (PHP Quick Profiler). Para ello he realizado cinco test:

  1. Usando la estructura foreach.
  2. Usando la estructura foreach y obteniendo la clave.
  3. Usando una iteración for ascendente.
  4. Usando una iteración for ascendente pero almacenando el tamaño del array en una variable.
  5. Usando una iteración for descendente.

La prueba realizada ha sido obtener el sumatorio de los elementos del array. El array tiene un tamaño de 300.000 elementos, obtenidos de forma aleatoria previamente a las pruebas. El código de cada una de las pruebas es el siguiente (el código del tercer se ha corregido gracias al comentario de SERGI):

// Test Nº 1
$total = 0;
foreach ($a as $item)
{
    $total += $item;
}

// Test Nº 2
$total = 0;
foreach ($a as $key => $item)
{
    $total += $item;
}

// Test Nº 3
$total = 0;
for($i = 0; $i < count($a); $i++)
{
    $total += $a[$i];
}

// Test Nº 4
$total = 0;
$fin = count($a);
for($i = 0; $i < $fin; $i++)
{
    $total += $a[$i];
}

// Test Nº 5
$total = 0;
for($i = count($a) -1; $i >= 0; $i--)
{
    $total += $a[$i];
}

Y los resultados han sido los siguientes:

Test Tiempo de ejecución
Nº 1 29.645 ms
Nº 2 38.315 ms
Nº 3 129.727 ms
Nº 4 35.427 ms
Nº 5 43.789 ms

Como se puede apreciar en el caso de PHP lo más rápido a la hora de recorrer un array parece que es usar la estructura foreach, aunque no presenta mucha diferencia con los bucles for cuando no se llama a la función count.

Personalmente para recorrer un array yo prefiero usar la construcción foreach, creo que así el código queda mucho más claro, aunque a raíz de esta pequeña prueba lo importante es realizar comparaciones simples en el for sin llamar a ninguna función.

Estas pruebas son mejorables, por ejemplo realizando varias pruebas y en un entorno más controlado que el equipo que he usado, pero creo que nos puede dar un breve indicio de como optimizar mejor nuestro código en cosas a las que no prestamos la suficiente atención.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , ,

junio 21, 2009 0

PHP Quick Profiler: perfilando nuestras aplicaciones en PHP.

By in Herramientas, PHP

PHP Quic Profiler es una utilidad que nos permite perfilar nuestro código PHP. Para ello recopila y nos muestra información sobre los recursos que utiliza nuestra aplicación. Con una presentación muy atractiva nos muestra datos sobre memoria usada, tiempo de ejecución, archivos incluidos o consultas SQL.

En la página podemos acceder a una demo, y también descargarnos la herramienta.

PHP Quick Profiler

PHP Quick Profiler

Una herramienta a tener en cuenta a la hora de optimizar nuestro código, lo cual es siempre una opción a tener en cuenta durante y tras el desarrollo de cualquier sistema.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , ,

junio 20, 2009 1

Gráficos en PHP con JpGraph. Parte III.

By in Librerías, PHP

En las dos anteriores entregas de este tutorial hemos visto como crear gráficos de lineas y gráficos de barras. Hoy les toca el turno a los gráficos de tarta. La forma de trabajar con ellos es muy parecida a los vistos anteriormente. Veamos un ejemplo:

<?php
// Evita que se vean los errores
error_reporting(0);
include("include/jpgraph.php");
include("include/jpgraph_pie.php");
$datos = array(9, 5, 12, 11, 6);
$grafico = new PieGraph(400, 300, "auto");
$grafico->SetScale("textlin");
$pieplot = new PiePlot($datos);
$grafico->Add($pieplot);
$grafico->Stroke();
?>

Y el resultado final es:

Séptimo ejemplo con JpGraph

Si analizamos el código podemos ver que en este caso usamos la clase PieGraph en lugar de la Graph y que los datos se pintan con la clase PiePlot. También, al ver el resultado, nos damos cuenta que los resultados los muestra como porcentajes.

La clase PiePlot provee de varios métodos para controlar la forma en la que se pinta el resultado. Vamos a ver algunos de esoso métodos:

Método Parámetros Descripción
SetColor $color: Color de la linea. Color de la linea que rodea los trozos de tarta.
SetSlicesColors $aColors: Array con colores Para indicar el color de cada uno de los trozos.
Explode $aExplodeArr: Array con los radios de énfasis. Permite enfatizar los pedazos indicándole un radio de separación del centro. Para ello se le pasa un array con los radios a los que se enfatiza cada elemento.
ExplodeAll $radius: Radio del énfasis. Aleja todas las porciones del centro en un radio dado.
ExplodeSice $e: Elemento a alejar.
$radius: Radio de alejamiento
Permite alejar un único pedazo.

Veamos un ejemplo usando alguno de estos métodos:

<?php
// Evita que se vean los errores
error_reporting(0);
include("include/jpgraph.php");
include("include/jpgraph_pie.php");
$datos = array(9, 5, 12, 11, 6);
$grafico = new PieGraph(400, 300, "auto");
$grafico->SetScale("textlin");
$pieplot = new PiePlot($datos);
$pieplot->SetSliceColors(array("red", "green", "blue", "yellow", "white"));
$pieplot->ExplodeSlice(1, 25);
$grafico->Add($pieplot);
$grafico->Stroke();
?>

El resultado sería el siguiente:

Octavo ejemplo con JpGraph

Con esto termina la tercera parte del tutorial. En el siguiente tutorial seguiremos viendo los gráficos de tarta para ver algunas opciones más avanzadas.

Y ahora los archivos con los ejemplos (no incluye la librería):

Ejemplos con JpGraph. Parte III.

ACTUALIZACIÓN 2012-12-05

Se ha añadido al código una linea de código que desactiva el reporte de errores de PHP. Esto se debe a que la versión de jpGraph para PHP 4 produce errores en versiones de PHP 5, que provocan que las imágenes generadas no se vean bien.

Todos los ejemplos de este artículo y de los demás artículos sobre jpGraph los podéis encontrar en gitHub, en el siguiente repositorio:

https://github.com/mjcarrascosa/jpGraphDemo

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , , ,

junio 19, 2009 3

Plantillas sencillas con TemplatePower. Parte III.

By in Librerías, PHP

Hoy vamos a retomar el tutorial sobre TemplatePower. En la anterior entrega vimos como crear bloques con el método newBlock. Hoy vamos a ver como pasar de un bloque a otro y como anidar bloques. Vamos a verlo con un ejemplo en el que tenemos un array donde cada elemento es a su vez otro array. Cada elemento de este último tiene dos campos, fecha y datos. El campo datos será otro array de arrays donde cada elemento contendrá dos campos, cantidad y concepto. Lo que vamos a hacer es sacar una tabla donde aparezca una cabecera con la fecha y luego detallados los conceptos y la cantidad. Al final aparecerá el total. Al final de la tabla aparecerá el total de sumar todos los totales. Veamos como quedaría la plantilla:

ejemploBloques3.tpl:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Segundo Ejemplo con Bloques</title>
</head>
<body>
<table border="1">
<!-- START BLOCK : dia -->
<tr>
<th colspan="2">{fecha}</th>
</tr>
<tr>
<th>Concepto</th>
<th>Cantidad</th>
</tr>
<!-- START BLOCK : dato -->
<tr>
<td>{concepto}</td>
<td>{cantidad}</td>
</tr>
<!-- END BLOCK : dato -->
<tr>
<td><strong>Total</strong></td>
<td>{total}</td>
</tr>
<!-- END BLOCK : dia -->
<tr>
<td><strong>Total final:</strong></td>
<td>{total_final}</td>
</table>
</body>
</html>

y el manejador de la plantilla:

ejemploBloques3.php:

<?php
include('class.TemplatePower.inc.php');

//Array con los datos
$datos = array(
	array('fecha' => '12-06-2009', 'datos' => array(
		array('concepto' => 'Camisa', 'cantidad' => 12),
		array('concepto' => 'Pantalon', 'cantidad' => 25),
		array('concepto' => 'Zapatos', 'cantidad' => 10),
		array('concepto' => 'bolso', 'cantidad' => 14)
		)),
	array('fecha' => '13-06-2009', 'datos' => array(
		array('concepto' => 'Gorra', 'cantidad' => 35),
		array('concepto' => 'Camisa', 'cantidad' => 40),
		array('concepto' => 'Camiseta', 'cantidad' => 25)
		)),
	array('fecha' => '14-06-2009', 'datos' => array(
		array('concepto' => 'Zapatos', 'cantidad' => 30),
		array('concepto' => 'Cinturon', 'cantidad' => 20),
		array('concepto' => 'Sandalias', 'cantidad' => 10),
		array('concepto' => 'Bolso', 'cantidad' => 25),
		array('concepto' => 'Camiseta', 'cantidad' => 25)
		)),
);

$plantilla = new TemplatePower('ejemploBloques3.tpl');
$plantilla->prepare();

$total = 0;
// recorremos el array
foreach ($datos as $dato)
{
	// creamos el bloque 'dia'
	$plantilla->newBlock('dia');
	$plantilla->assign('fecha', $dato['fecha']);
		$total_parcial = 0;
	// recorremos el array
	foreach ($dato['datos'] as $elemento)
	{
		// creamos el bloque dato
		$plantilla->newBlock('dato');
		$plantilla->assign('concepto', $elemento['concepto']);
		$plantilla->assign('cantidad', $elemento['cantidad']);

		$total_parcial += $elemento['cantidad'];
	}

	// volvemos al bloque dia para asignar el total
	$plantilla->gotoBlock('dia');
	$plantilla->assign('total', $total_parcial);

	$total += $total_parcial;

}

// volvemos al bloque raiz para asignar el total de totales
$plantilla->gotoBlock('_ROOT');
$plantilla->assign('total_final', $total);

// generamos las plantillas
$plantilla->printToScreen();
?>

Lo que hacemos es recorrer el array con los datos, con el foreach, y creamos un bloque ‘dia’. Acto seguido recorremos el array con los datos de cada día, de nuevo con un bucle foreach, y  creamos un nuevo bloque ‘dato’ asignado las variables ‘concepto’ y ‘cantidad’, también vamos calculando el total parcial como suma de las cantidades. Acto seguido volvemos al bloque ‘dia’ para asignar la variable total y vamos calculando el total final como suma de los totales parciales. Al finalizar el primer bucle volvemos al bloque raiz y asignamos el total final.

Espero que con este sencillo ejemplo se hayan entendido bien los bloques anidados y el funcionamiénto del método gotoBlock. De todas formas si hay alguna duda en los comentarios se puede preguntar cualquier cosa, que gustosamente trataré de responder.

Ya para finalizar el código con el ejemplo del artículo (no incluye la librería TemplatePower):

Template Power. Segundo ejemplo con bloques.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , , ,

junio 18, 2009 11

Gráficos en PHP con JpGraph. Parte II.

By in Librerías, PHP

Hoy vamos a ver como crear gráficos de barras. Empecemos con un sencillo ejemplo:

<?php
// Evita que se vean los errores
error_reporting(0);
include("include/jpgraph.php");
include("include/jpgraph_bar.php");
$datos1 = array(9, 5, 12, 11, 6, 10, 9, 11, 10, 4, 7, 3);
$grafico = new Graph(400, 300, "auto");
$grafico->SetScale("textlin");
$grafico->title->Set("Ejemplo JpGraph");
$grafico->xaxis->title->Set("Eje X");
$grafico->yaxis->title->Set("Eje Y");
$barplot1 = new BarPlot($datos1);
$barplot1->SetColor("red");
$barplot1->SetFillColor("red");
$grafico->Add($barplot1);
$grafico->Stroke();
?>

El gráfico quedaría tal cual:

Cuarto ejemplo con JpGraph

En este caso hemos usado la clase BarPlot, en lugar de la LinePlot de los anteriores ejemplos, para generar el gráfico de barras. En esta ocasión vemos que se llama a un método de la clase BarPlot llamado SetFillColor. Este método se usa para asignar el color de fondo de las barras. Existe otro método llamado SetFillGradient que nos permite realizar el relleno de las barras mediante un gradiente. Podemos también controlar el ancho de las barras con el método SetWidth. Vamos a ver esto último con un ejemplo:

<?php
// Evita que se vean los errores
error_reporting(0);
include("include/jpgraph.php");
include("include/jpgraph_bar.php");
$datos1 = array(9, 5, 12, 11, 6, 10, 9, 11, 10, 4, 7, 3);
$grafico = new Graph(400, 300, "auto");
$grafico->SetScale("textlin");
$grafico->title->Set("Ejemplo JpGraph");
$grafico->xaxis->title->Set("Eje X");
$grafico->yaxis->title->Set("Eje Y");
$barplot1 = new BarPlot($datos1);
$barplot1->SetColor("red");
// Un gradiente Horizontal de rojo a azul
$barplot1->SetFillGradient("red", "blue", GRAD_HOR);
// 25 pixeles de ancho para cada barra
$barplot1->SetWidth(25);
$grafico->Add($barplot1);
$grafico->Stroke();
?>

El gráfico sería:

Quinto ejemplo con JpGraph

También podemos combinar gráficos, como por ejemplo uno de barras con uno de lineas, como en el ejemplo siguiente:

<?php
// Evita que se vean los errores
error_reporting(0);
include("include/jpgraph.php");
include("include/jpgraph_bar.php");
include("include/jpgraph_line.php");
$datos1 = array(9, 5, 12, 11, 6, 10, 9, 11, 10, 4, 7, 3);
$datos2 = array(5, 7, 1, 11, 13, 4, 9, 6, 12, 7, 1, 4);
$grafico = new Graph(400, 300, "auto");
$grafico->SetScale("textlin");
$grafico->title->Set("Ejemplo JpGraph");
$grafico->xaxis->title->Set("Eje X");
$grafico->yaxis->title->Set("Eje Y");
$barplot1 = new BarPlot($datos1);
$barplot1->SetColor("red");
// Un gradiente Horizontal de rojo a azul
$barplot1->SetFillGradient("red", "blue", GRAD_HOR);
// 25 pixeles de ancho para cada barra
$barplot1->SetWidth(25);
$lineplot = new LinePlot($datos2);
$lineplot->SetColor("green");
$lineplot->SetWeight(2);
$grafico->Add($barplot1);
$grafico->Add($lineplot);
$grafico->Stroke();
?>

Que quedaría de la siguiente manera:

Sexto ejemplo con JpGraph

Con esto es todo por hoy. Para finalizar y por no faltar a la costumbre os dejo aquí los archivos con los ejemplos del artículo:

Ejemplos con JpGraph. Parte II.

ACTUALIZACIÓN 2012-12-05

Se ha añadido al código una linea de código que desactiva el reporte de errores de PHP. Esto se debe a que la versión de jpGraph para PHP 4 produce errores en versiones de PHP 5, que provocan que las imágenes generadas no se vean bien.

Todos los ejemplos de este artículo y de los demás artículos sobre jpGraph los podéis encontrar en gitHub, en el siguiente repositorio:

https://github.com/mjcarrascosa/jpGraphDemo

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , , , ,