Uno degli argomenti più interessanti (e a volte ostici) quando si inizia ad imparare a programmare in PHP sono gli Array. Il linguaggio PHP dimostra una particolare espressività sintattica con gli array. Si tratta delle strutture dati a scopo generico al centro di qualsiasi applicativo. Solitamente nei linguaggi di programmazione con il termine “array” si indica la struttura dati più semplice in grado di catalogare oggetti e permetterne il recupero in base alla posizione. In PHP il termine array indica la struttura dati principale, molto potente, con cui può essere svolta qualsiasi operazione.
In PHP gli Array sono eterogenei pertanto possono contenere oggetti di vario genere, anche ulteriori array creando così strutture dati annidate.
La sintassi degli array prevede l’uso di parentesi quadre sia per l’assegnazione di valori sia per la loro lettura. Di base, si interagisce con un array passando tra le parentesi quadre la posizione (conteggiata a partire da 0) dell’elemento con cui si vuole lavorare. Aspetto molto interessante è la possibilità di utilizzare gli array anche in modalità associativa dove, al posto di una chiave numerica di accesso, si avranno delle etichette univoche: per chi avesse già esperienza di programmazione, tale uso ricorda quello delle mappe di Java o dei dizionari di Python, tanto per intenderci.
Un Array PHP può essere semplicemente creato mediante l’invocazione della funzione array:
$incasso=array();
o inizializzando direttamente i suoi elementi mediante assegnazioni:
$incasso[0]=1000; $incasso[1]=450; $incasso[2]=120; $incasso[3]=400;
In questo caso, abbiamo inserito quattro elementi nelle prime posizioni valide, contandone gli indici a partire come indicato dallo zero. Come detto, gli array PHP possono contenere anche elementi eterogenei qualora questo sia funzionale agli scopi del nostro programma:
$vari_oggetti[]=1.5; $vari_oggetti[]=true; $vari_oggetti[]="Lorenzo"; $vari_oggetti[]=2000;
In questo caso, abbiamo inserito al suo interno, rispettivamente, un numero in virgola, un booleano, una stringa ed un numerico intero: l’array è perfettamente in grado di conservarli tutti. Se si vuole avere reale conferma delle varie tipologie di dato utilizzate si può ricorrere all’uso di una funzione inventata appositamente a scopo di debug che mostra la struttura interne delle variabili PHP (non solo array): var_dump
. Applicandola all’array appena creato, con l’invocazione di var_dump($vari_oggetti)
, otteniamo quanto riportato nella figura seguente:
Inoltre, nell’ultimo stralcio di codice, a differenza dell’esempio precedente, abbiamo usato le parentesi graffe vuote: questa notazione si usa quando l’elemento da aggiungere va inserito in coda all’array ossia nella prima posizione ancora non occupata.
La verifica del contenuto, oltre che tante altre operazioni, può essere svolta sfruttando il costrutto del ciclo. Uno dei modi più pratici è la versione PHP del foreach che itera ogni elemento di una struttura dati eseguendo su di esso le operazioni previste nel blocco di codice:
foreach ($vari_oggetti as $a) { // operazioni da svolgere su $a }
In questo caso abbiamo percorso ogni elemento dell’array $vari_oggetti etichettandolo con la variabile $a.
Sinora abbiamo visto l’uso più immediato degli array, quello dove gli elementi sono indicati per posizione, ma quello associativo, già citato, riveste un ruolo di assoluto primo piano, vediamo come funziona.
Un elemento in un array può essere riconosciuto non solo dalla posizione, come detto precedentemente, ma anche in base ad una chiave univoca mediante la quale potrà essere estratto in maniera molto efficiente. Supponiamo di voler registrare una pagella scolastica in un programma PHP. Potremmo usare in questo caso proprio un array associativo:
$pagella['Italiano']=8; $pagella['Matematica']=6; $pagella['Geografia']=9; $pagella['Storia']=7; $pagella['Chimica']=5;
In questo modo, possiamo immaginare di avere inserito il valore 8 etichettato con la stringa ‘Italiano’, 6 con ‘Matematica’ e via dicendo. Tutto ciò contribuisce a dare una significatività molto più marcata ai valori. Se volessimo sapere il voto ottenuto in Storia, ad esempio, sarà sufficiente richiederlo con $pagella['Storia']
.
PHP permette inoltre di estrarre sia l’elenco delle chiavi con la funzione array_keys()
sia quello dei valori con array_values()
.
L’invocazione di array_keys($pagella)
fornirà la sequenza ‘Italiano’, ‘Matematica’, ‘Geografia’, ‘Storia’, ‘Chimica’ mentre quella di array_values($pagella)
darà la lista 8,6,9,7,5.
Ciò che rende ancora più versatili ed utili gli array PHP è il grande numero di funzioni offerto a loro supporto. Ne esistono molte e di categorie diverse ma qui di seguito proveremo ad individuarne alcune significative, suddivise per finalità.
Per cominciare, ce ne sono alcune che permettono di gestire la “popolazione” di un array. Una delle più comuni in assoluto è count
che restituisce la lunghezza di un array PHP ossia il numero di elementi presenti al suo interno al momento attuale.
Riferendoci all’esempio della pagella visto in precedenza, l’espressione count($pagella)
restituirebbe 5, vale a dire il numero di accoppiate materia/voto inserite.
La popolazione di un array può essere anche generata in automatico. Particolarmente utili in questi casi sono funzioni come array_fill()
che crea un nuovo array riempito di elementi uguali e range()
che inizializza una struttura dati con numeri progressivi.
Tanto per renderci conto del loro modus operandi, consideriamo che l’espressione array_fill(0, 10, -1)
restituisce un nuovo array di 10 elementi tutti valorizzati con -1.
Questo sarebbe il suo var_dump:
array (size=10) 0 => int -1 1 => int -1 2 => int -1 … … 8 => int -1 9 => int -1
La funzione range può essere utile con espressioni tipo range(1,12)
che riempie un array, nelle posizioni da 0 a 11, dei valori compresi tra 1 e 12. Tale funzione può rivelarsi utile anche nei cicli per programmare più facilmente un for che dovrebbe contare in un range di valori. Ad esempio, il seguente ciclo:
foreach (range(1,12) as $n) { // operazioni da svolgere }
si può considerare identico a:
for ($n=1; $n<=12; $n++) { // operazioni da svolgere }
Le funzioni appena viste sono state esemplificate nelle loro forme più semplici ma il loro comportamento può essere personalizzato mediante gli argomenti.
Visto che in un array inseriamo dei dati, è importante poter svolgere su di essi qualsiasi tipo di ricerca. Con array_key_exists()
possiamo verificare se una determinata materia è studiata nella scuola che ha rilasciato la pagella mentre con in_array(9, $pagella)
possiamo verificare se tra i voti ottenuti in pagella c'è almeno un 9. Il risultato è booleano quindi verrà restituito vero se l'elemento è stato individuato, falso altrimenti.
La funzione array_search()
invece restituisce la chiave del primo oggetto trovato con quel valore.
Per la suddivisione di un array, possiamo usare altre funzioni tra cui array_slice
e array_chunk
. La prima restituisce una porzione dell'array in base agli indici forniti: si potrebbe, ad esempio, richiedere tre elementi a partire dalla posizione 2 di un determinato array. La seconda invece svolge un lavoro diverso suddividendo un array in porzioni della stessa dimensione.
Per citare un'ulteriore categoria possiamo pensare a funzioni che servono ad ordinare un array, azione fondamentale per individuare valori estremi in un intervallo e a questo scopo esistono sort
e rsort
ma PHP permette anche di portare il "disordine" tra gli elementi con le funzioni shuffle
o array_rand
che estrae alcuni elementi a caso dall'array.
Queste sono solo alcune delle funzioni disponibili (qui potete trovare un elenco completo di funzioni PHP per gli Array con relativa documentazione), le abbiamo scelte appositamente per dimostrare la vastità del campo d'azione in cui PHP ha predisposto strumenti per operare con queste strutture dati.
In conclusione, possiamo considerare gli array PHP non solo uno strumento indispensabile per la programmazione, ma anche un ottimo esempio della duttilità di questo linguaggio e del suo interesse a spingere ai massimi livelli la produttività del programmatore. Con gli array potremo creare qualsiasi rete di informazione annidandoli tra loro o utilizzando una struttura associativa o per posizione senza la necessità di scartabellare la documentazione alla ricerca della struttura dati più adatta come avviene in molti altri linguaggi di programmazione.