Nella lezione dedicata alle variabili in PHP abbiamo visto che attraverso l’operatore (.) è possibile concatenare tra loro delle stringhe per creare, ad esempio, dei testi variabilizzati. Ad esempio:
<?php
/*
Variabili
*/
$marca = 'Fiat';
$modello = 'Panda';
$anno = 2010;
$alimentazione = 'benzina';
$cilindrata = 900;
$euro = 3000;
/*
Stampo a video
*/
echo 'Vendesi ' . $marca . ' ' . $modello . ' del ' . $anno . ', alimentazione: ' . $alimentazione . ', cilindrata: ' . $cilindrata . ' al prezzo di ' . $euro . ' Euro';
?>
La sintassi PHP che abbiamo visto nell’esempio qui sopra è assolutamente corretta, tuttavia avremmo potuto trovare un’altra via per formattare la nostra stringa variabilizzata in modo certamente più elegante e meno soggetto ad errori.
La funzione sprintf()
Il linguaggio PHP, infatti, offre la funzione sprintf() proprio per far fronte ad esigenze come questa. Grazie a sprintf(), infatti, possiamo raggiungere lo stesso obiettivo migliorando la leggibilità del nostro codice e, contestualmente, riducendo sensibilmente il rischio di commettere errori.
La funzione sprintf() di PHP consente, infatti, di formattare una stringa secondo quanto definito nel parametro formato. La sua sintassi è la seguente:
sprintf($formato, $var1, $var2, ..., $varN);
Il numero minimo di parametri è due, tuttavia l’utilità di sprintf cresce all’aumentare dei parametri utilizzati (oltre che della complessità del formato).
Il parametro formato non è altro che la nostra stringa al cui interno andremo a definire dei placeholder (dei "segnaposto") che andranno ad essere "riempiti" dagli altri parametri passati alla funzione.
Vediamo, di seguito, come riscrivere l’esempio visto all’inizio sfruttando la potenza di sprintf():
<?php
/*
Variabili
*/
$marca = 'Fiat';
$modello = 'Panda';
$anno = 2010;
$alimentazione = 'benzina';
$cilindrata = 900;
$euro = 3000;
/*
Formato
*/
$formato = "Vendesi %s %s del %d, alimentazione: %s, cilindrata: %d al prezzo di %d";
/*
Stampo a video
*/
echo sprintf($formato, $marca, $modello, $anno, $alimentazione, $cilindrata, $euro);
?>
In pratica la funzione sprintf() andrà a sostituire i vari placeholder (nel nostro esempio si tratta di diverse occorrenze di %s e %d) con le variabili $marca, $modello, $anno, ecc.
La sostituzione dei placeholder (che, come vedremo, sono identificati dal simbolo della percentuale, anche detto "specifica di conversione", seguito da un carattere detto "indicatore di tipo") con le nostre variabili avviene in sequenza, seguendo cioè l’ordine dei parametri specificati nella funzione.
I tipi di dato più utilizzati in sprintf()
Nel nostro esempio abbiamo utilizzato i placeholder %s e %d che corrispondono, rispettivamente, ad un dato stringa e ad uno numerico.
PHP prevede differenti placeholder per sprintf() a seconda del tipo di dato atteso. I più utilizzati sono tre, cioè:
- %d – numero decimale con segno
- %f – numero in virgola mobile
- %s – stringa
Vediamo un esempio che prevede l’utilizzo di questi tre tipi di dato:
<php
/*
Variabili
*/
$qta = 3;
$frutta = 'mele';
$euro = 1.846;
/*
Formato
*/
$formato = "Ho comprato %d $s per %.2f Euro";
/*
Stampo a video
*/
echo sprintf($formato, $qta, $frutta, $euro);
?>
L’output del nostro codice sarà:
Ho comprato 3 mele per 1.85 Euro
L’elemento caratterizzante di questo esempio è certamente l’utilizzo del segnaposto %.2f che sta ad indicare al motore PHP che il dato atteso è un numero con virgola a due cifre decimali (cioè il formato della valuta Euro).
Informazioni opzionali all’interno dei segnaposto
Quest’ultimo esempio è importante in quanto rivela un’altra caratteristica dei segnaposto: questi, infatti, possono contenere, oltre al simbolo percentuale ed al tipo di dato, altre informazioni: nel nostro esempio tra il simbolo della percentuale (%) ed il tipo di dato (f) è presente un’ulteriore informazione rappresentata da ".2" la quale sta ad indicare il numero di cifre decimali attese.
Le informazioni opzionali che è possibile inserire all’interno dei placeholder sono (in ordine di eventuale inserimento):
- (solo per i numeri) il segno (+ o -);
- il carattere di riempimento (cioè il carattere che sarà utilizzato per completare la stringa risultante in modo da raggiungere l’eventuale dimensione richiesta);
- l’allineamento (qualora venga specificata una dimensione l’allineamento di default è a destra, il carattere "-" forza l’allineamento a sinistra);
- la dimensione (cioè un parametro numerico che indica di quanti caratteri debba essere la lunghezza minima della stringa);
- (solo per i numeri a virgola mobile) la precisione (cioè un parametro composto da un numero preceduto da un puntino).
Per meglio comprendere il funzionamento di queste informazioni opzionali vediamo un ulteriore esempio:
<php
/*
Variabili
*/
$scaffale = 'A18';
$posto = 23;
$codice = 136;
/*
Formato
*/
$formato = "Scaffale %s posto %d codice prodotto %05d";
/*
Stampo a video
*/
echo sprintf($formato, $scaffale, $posto, $codice);
?>
L’output del nostro codice sarà:
Scaffale A18 posto 23 codice prodotto 00136
In pratica il segnaposto %05d sta ad indicare che il dato da mostrare dovrà essere un numero composto (come minimo) da 5 cifre e qualora il numero ne abbia di meno (nel nostro esempio è composto da tre cifre) dovranno essere anteposti tanti zeri quanti ne saranno necessari per raggiungere la dimensione richiesta.
Se avessimo utilizzato il segnaposto %0-5d gli zeri sarebbero stati aggiunti dopo il numero e non prima (il simbolo "-", come abbiamo visto, forza l’allineamento a sinistra).
Altri tipi di dato
Oltre ai tre segnaposto visti in precedenza ne esistono altri (meno utilizzati), che sono:
- %b – numero binario
- %c – carattere in formato ASCII
- %e – notazione scientifica in minuscolo (e.g. 1.2e+2)
- %E – notazione scientifica in maiuscolo (e.g. 1.2E+2)
- %F – numero in virgola mobile (senza verifica delle impostazioni di sistema)
- %o – numero in base otto (numero ottale)
- %u – numero decimale senza segno
- %x – numero esadecimale minuscolo
- %X – numero esadecimale maiuscolo
Da segnalare anche il segnaposto %% che è utilizzato per il simbolo della percentuale, ad esempio:
<php
/*
Variabili
*/
$qta = 3;
$frutta = 'mele';
$sconto = 25;
/*
Formato
*/
$formato = "Comprando %d %s hai diritto ad uno sconto del %d%%";
/*
Stampo a video
*/
echo sprintf($formato, $qta, $frutta, $sconto);
?>
L’output del nostro codice sarà:
Comprando 3 mele hai diritto ad uno sconto del 25%
La funzione printf()
La funzione sprintf(), come abbiamo visto, restituisce una stringa formattata secondo le direttive dello sviluppatore. Qualora la necessità fosse, semplicemente, quella di stampare a video il risultato di tale formattazione è possibile utilizzare la funzione printf().
Il funzionamento di printf() è del tutto analogo e pertanto valgono le considerazioni viste sopra. In altre parole possiamo dire che:
printf(...);
// è identico a
echo sprintf(...);