Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Come creare grafici da un array con PHP e le librerie GD

Utilizzare le librerie GD in PHP per creare grafici dinamici a partire da un array di dati: codice ed esempi d'uso
Utilizzare le librerie GD in PHP per creare grafici dinamici a partire da un array di dati: codice ed esempi d'uso
Link copiato negli appunti

In questa breve trattazione vedremo come sia possibile creare facilmente un comune grafico basato su griglie, barre e percentuali come nell'esempio riportato dall'immagine sottostante.

Figura 1: Grafico dinamico di esempio
Grafico dinamico di esempio

Per far questo sarà sufficiente ricorrere a PHP, alle librerie GD ed in particolare alle numerosissime funzioni messe a disposizione da questo linguaggio per la gestione e la manipolazione delle immagini.

La funzione per la creazione dei grafici

Al fine di descrivere una possibile procedura per la creazione dei grafici, verrà proposta una funzione in grado di generare un'immagine completa a partire dai valori contenuti all'interno di un array. Innanzitutto, sarà messo a disposizione l'intero codice che costituisce l'applicazione per poi descriverne i diversi passaggi, i commenti aiuteranno comunque a riconoscere le diverse funzionalità svolte all'interno del listato.

<?php
# definizione della funzione e delle variabili
function crea_grafico($array)
{
# controllo sulla presenza, sull'entità e sulla validità dell'array
    if (!@isset($array) || @empty($array) || @count($array) > 20)
    {
# valore di ritorno in caso di array assente o non valido
        return FALSE;
    }

   # ricerca del valore massimo all'interno dell'array
 $valore_massimo = @max($array);
        # conversione dei valori dell'array in percentuali fatto 100 il valore massimo
    $nuovo_array = array();
    foreach ($array as $val)
    {
        $nuovo_array[] = @intval($val / $valore_massimo * 100);
    }

   //creazione di un'immagine 450(larghezza) * 150(altezza)
    $immagine = @imagecreatetruecolor(450, 150);

   # definizione dei colori degli elementi del grafico (valori RGB esadecimali)
    # colore: antiquewhite
    $colore_di_sfondo = @imagecolorallocate($immagine, 250, 235, 215);
    # colore: lightslategray
    $colore_griglia = @imagecolorallocate($immagine, 119, 136, 153);
   # colore: olivedrab
    $colore_barre = @imagecolorallocate($immagine, 107, 142, 35);
   # colore: navy
    $colore_testo = @imagecolorallocate($immagine, 0, 0, 128);

   # riempimento dell'immagine con il colore di sfondo
    @imagefill($immagine, 0, 0, $colore_di_sfondo);

    
   # creazione della griglia
    # creazione delle linee orizzontali
    for ($i=1; $i<=10; $i++)
    {
        @imageline($immagine, 0, $i*10+40, 450, $i*10+40, $colore_griglia);
    }

   # creazione delle linee verticali
    $spazio = @intval(450 / @count($nuovo_array));
    for ($i=1; $i<=@count($nuovo_array); $i++)
    {
        @imageline($immagine, $i*$spazio, 40, $i*$spazio, 150, $colore_griglia);
    }

   # disegno del grafico
    for ($i=0; $i<@count($nuovo_array); $i++)
    {
        $j = @intval($spazio/2) -1 + $spazio*$i;
        @imagefilledrectangle($immagine, $j, 150, $j+3, 150-$nuovo_array[$i], $colore_barre);
@imagestringup($immagine, 2, $j-5, 150-$nuovo_array[$i]-10,  $nuovo_array[$i].'%',$colore_testo);
    }

   # definizione del tipo di contenuto MIME
    @header("Content-type: image/png");
   # restituzione in output dell'immagine
    @imagepng($immagine);
   #liberazione della memoria associata all'immagine
    @imagedestroy($immagine);
}
?>

Il codice proposto può apparire un po' lungo ma non è di certo complesso, le funzioni utilizzate e in particolare quelle dedicate da PHP alle librerie GD sono invece numerose e meritano di essere descritte nel dettaglio.

Le funzioni per la creazione di grafici con PHP e le GD

La prima parte del codice sarà dedicata alla definizione del nome della funzione per la creazione del grafico, all'introduzione delle variabili che dovranno essere passate come argomento alla funzione e ai controlli che verranno effettuati su questa variabile:

function crea_grafico($array)
{
    if (!@isset($array) || @empty($array) || @count($array) > 20)
    {
        return FALSE;
    }

Nel caso specifico si ha che:
  • come unico argomento per la funzione verrà passata una variabile array destinata a contenere i valori da convertire e mostrare all'interno del grafico;
  • l'array, per poter essere utilizzato dovrà essere stato definito, non dovrà essere vuoto e non dovrà essere composto da un numero di valori superiore a 20 (la cifra non è vincolante, può essere anche inferiore o superiore e potrà essere modificata arbitrariamente dall'utilizzatore);
  • se una sola delle tre condizioni precedenti non dovesse essere rispettata la funzione si limiterà a restituire il valore booleano FALSE.

Superata la fase relativa ai controlli, l'array e i valori in esso contenuti potranno essere elaborati:

    $valore_massimo = @max($array);
    $nuovo_array = array();
    foreach ($array as $val)
    {
        $nuovo_array[] = @intval($val / $valore_massimo * 100);
    }

La funzione max() ha il semplice compito di trovare il massimo valore contenuto all'interno di un array; il valore più alto, verrà utilizzato come base 100 per la conversione di tutti i valori presenti nell'array originale nei corrispondenti valori percentuali; per far questo, tramite un ciclo foreach verrà creato un nuovo array contenente come valori i valori dell'array originale divisi per il valore più elevato moltiplicato 100, l'intera operazione verrà passata alla funzione intval() in modo da ottenere soltanto numeri interi grazie all'eliminazione dei decimali.

Fatto questo si potrà passare alla fase relativa alla creazione dell'immagine che conterrà i dati:

 $immagine = @imagecreatetruecolor(450, 150);

La funzione imagecreatetruecolor() ha infatti il compito di creare un'immagine sulla base di due semplici coordinate numeriche separate da una virgola: larghezza e altezza dell'immagine stessa.

La fase successiva sarà quella dedicata alla definizione dei colori che caratterizzeranno i diversi elementi del grafico:

$colore_di_sfondo = @imagecolorallocate($immagine, 250, 235, 215);
$colore_griglia = @imagecolorallocate($immagine, 119, 136, 153);
$colore_barre = @imagecolorallocate($immagine, 107, 142, 35);
$colore_testo = @imagecolorallocate($immagine, 0, 0, 128);

Per far questo verrà utilizzata la funzione imagecolorallocate(), essa ha il compito di memorizzare il dato relativo ad un determinato colore per una specifica porzione di un'immagine identificata da una variabile; a questo scopo, la funzione accetta come parametri la variabile che rappresenta l'immagine e tre numeri interi detti valori RGB esadecimali, un modello di definizione e visualizzazione dove ciascun colore è identificato da tre gruppi di cifre con valori che vanno da 0 a 255.

Definita la parte relativa all'allocazione dei colori si potrà passare a quella necessaria per il riempimento dell'immagine di sfondo:

@imagefill($immagine, 0, 0, $colore_di_sfondo);

imagefill() è una funzione che si occupa di colorare una determinata immagine sulla base di quattro coordinate:

  • la variabile relativa all'immagine da colorare;
  • la coordinata "x" che definisce il punto di partenza sull'asse orizzontale;
  • la coordinata "y" che definisce il punto di partenza sull'asse verticale;
  • il colore da utilizzare per la colorazione.

Dato che nel caso specifico le coordinate relative ad entrambi gli assi cartesiano avranno un valore pari a "0", l'immagine verrà riempita completamente con il colore precedentemente definito per lo sfondo tramite l'utilizzo della funzione imagecolorallocate().

Sarà ora possibile passare alla fase relativa al disegno della griglia destinata a contenere i dati:

   #  linee orizzontali
    for ($i=1; $i<=10; $i++)
    {
        @imageline($immagine, 0, $i*10+40, 450, $i*10+40, $colore_griglia);
    }

   #  linee verticali
    $spazio = @intval(450 / @count($nuovo_array));
    for ($i=1; $i<=@count($nuovo_array); $i++)
    {
        @imageline($immagine, $i*$spazio, 40, $i*$spazio, 150, $colore_griglia);
    }

Questo procedimento si basa in particolare sull'utilizzo della funzione imageline() che ha il compito di disegnare una linea sulla base delle coordinate passate come parametri; nel caso specifico verranno disegnate per prime 10 linee orizzontali della dimensione di 10 pixels ciascuna in modo da rappresentare le percentuali, quindi verranno disegnate le linee verticali il cui numero potrà essere diverso a seconda dei valori che l'utilizzatore deciderà di inserire all'interno dell'array.

Si passerà ora alla porzione di codice destinata alla creazione delle barre all'interno dell'immagine e alla scrittura dei relativi valori percentuali:

    for ($i=0; $i<@count($nuovo_array); $i++)
    {
        $j = @intval($spazio/2) -1 + $spazio*$i;
        @imagefilledrectangle($immagine, $j, 150, $j+3, 150-$nuovo_array[$i], $colore_barre);
         @imagestringup($immagine, 2, $j-5, 150-$nuovo_array[$i]-10,        nuovo_array[$i].'%',$colore_testo);
    }

Questa parte dell'applicazione si occuperà innanzitutto di calcolare il numero delle barre necessarie alla rappresentazione dei valori sulla base degli elementi contenuti all'interno dell'array, per poi disegnarle. A questo scopo verranno introdotte due nuove funzioni:

  • imagefilledrectangle() che utilizza gli stessi parametri di imageline(), ma ha il compito di generare un'immagine rettangolare riempita con il colore precedentemente memorizzato tramite l'uso della funzione imagecolorallocate();
  • imagestringup() che ha il compito di disegnare una stringa verticalmente, in questo modo sarà possibile scrivere i valori percentuali al di sopra delle barre occupando una spazio massimo di 10 pixels in senso orizzontale.

Ora non resterà che scrivere la parte relativa alla generazione dell'output:

    @header("Content-type: image/png");
    @imagepng($immagine);
    @imagedestroy($immagine);

Dato che l'immagine verrà generata in formato PNG (tramite l'utilizzo della funzione imagepng() ideata per questo scopo), sarà necessario che questo formato venga specificato correttamente nel Content-type della pagina che mostrerà l'immagine, in questo modo il browser sarà in grado di riconoscere il tipo MIME inviato dal server. Un volta prodotto l'output, lo spazio di memoria da esso occupato potrà essere liberato passando la variabile relativa all'immagine generata alla funzione imagedestroy() che di occuperà eliminarla.

Uso pratico della funzione per la creazione di grafici

L'utilizzo della funzione precedentemente descritta è molto semplice, basterà richiamare il file che la contiene tramite un include() in una qualsiasi pagina in cui la si desidera utilizzare; tramite un ciclo for sarà possibile definire il numero di elementi da associare all'array che sarà anche parametro della funzione, in questo caso basterà associare il numero scelto di componenti alla condizione di terminazione del ciclo for ("12" nell'esempio riportato in basso).

Ad ognuno degli elementi inseriti nell'array sarà poi possibile associare un valore casuale tramite la funzione rand(), a cui passare come parametri gli estremi di un intervallo all'interno del quale estrarre casualmente i valori da convertire in percentuali.

Ovviamente, verrà prodotto un grafico differente ad ogni refresh della pagina.

<?php
# inclusione del file della funzione
@include "diagramma.php";
# inserimento dei valori all'interno dell'array
for ($i=0; $i<12; $i++)
    {
    $array[] = @rand(0, 400);
}
# chiamata della funzione e creazione del grafico
@crea_grafico($array);
?>

Conclusioni

In questa breve trattazione è stata descritta una possibile procedura per la creazione di grafici completi di griglie, barre e dati espressi in percentuali utilizzando PHP e le funzioni messe a disposizione da questo linguaggio per l'utilizzo delle librerie GD.

Nel caso specifico la problematica è stata risolta tramite la realizzazione di un'apposita funzione, è possibile però utilizzare procedure differenti sfruttando i numerosissimi strumenti messi a disposizione da PHP per la manipolazione delle immagini.

Ti consigliamo anche