Abbiamo visto nella precedente lezione come attraverso i costrutti for
e while
sia possibile eseguire dei cicli finché una determinata condizione è vera. Nella lezione relativa ai tipi di dato, invece, abbiamo introdotto il tipo array. Come già definito, un array può essere considerato una matrice matematica ad una o più dimensioni.
$array_monodimensionale = array(1, 2, 3, 4, 5);
$array_multidimensionale = array(
'chiave1' => 1,
'chiave2' => 2,
'chiave3' => 3,
'chiave4' => 4,
'chiave5' => 5
);
Nel caso volessimo effettuare delle operazioni per ogni elemento del nostro array, potremmo eseguire un ciclo for
o while
verificando che l'indice (cioè la posizione all'interno dell'array) sia minore alla dimensione dell'array. È una soluzione però alquanto scomoda e poco performante.
Esiste in PHP un ulteriore costrutto, il foreach
, con cui è possibile ciclare anche gli array senza effettuare controlli sulla loro dimensione. PHP si occuperà automaticamente di terminare il ciclo quando tutti gli elementi sono stati processati. Analizziamo un esempio che calcola la somma degli elementi di un array:
$array_monodimensionale = array(1, 2, 3, 4, 5);
$somma = 0;
foreach ($array_monodimensionale as $valore) {
$somma += $valore;
}
echo "La somma degli elementi dell'array è: " . $somma;
Il costrutto dopo la parola chiave foreach
include all'interno delle parentesi tonde tre elementi:
- l'array da ciclare
- la parola chiave
as
- la variabile che contiene il valore dell'indice corrente
Come i cicli finora descritti, anche il foreach
conterrà il codice da eseguire ad ogni iterazione all'interno delle parentesi graffe.
Foreach e array multidimensionali
Abbiamo visto come sia facile ciclare gli elementi di un array ad una sola dimensione. Ma un array può prevedere anche più dimensioni. Vediamo quindi come ciclare un array multidimensionale:
$eta_utenti = array(
'Simone' => 29,
'Josephine' => 30,
'Giuseppe' => 23,
'Renato' => 26,
'Gabriele' => 24
);
$somma_eta = 0;
foreach ($eta_utenti as $nome => $eta) {
echo "L'utente " . $nome . " ha " . $eta . " anni\n";
$somma_eta += $eta;
}
echo "La somma delle età degli utenti è: " . $somma_eta;
Nell'esempio precedente stampiamo per ogni utente il nome e l'età di ognuno e, contestualmente, sommiamo le età di tutti. Il foreach ha una sintassi identica a quella dell'esempio precedente con la differenza che, in caso di array a più dimensioni, si utilizzano due variabili: la variabile che identifica l'indice dell'array (nel nostro caso il nome dell'utente) e la variabile che identifica il valore dell'indice (nel nostro caso l'età).
Modificare gli elementi di un array attraverso il foreach
Riprendendo l'esempio appena proposto e supponendo di voler modificare i valori dell'array aggiungendo un anno alle età di tutti gli utenti, la soluzione che sicuramente ci viene in mente è quella di utilizzare il foreach e sommare "1" ad ogni iterazione.
$eta_utenti = array(
'Simone' => 29,
'Josephine' => 30,
'Giuseppe' => 23,
'Renato' => 26,
'Gabriele' => 24
);
foreach ($eta_utenti as $nome => $eta) {
$eta++;
}
print_r($eta_utenti);
La funzione
print_r
ci consente di stampare a schermo il contenuto di un array.
Se proviamo ad eseguire il seguente codice, noteremo che i valori resteranno intatti e l'incremento non viene in realtà applicato. Questo accade perché il PHP generalmente crea una copia in memoria dell'array e lavora su di essa, anziché lavorare sullo spazio di memoria allocato dall'array originale. Nel caso in cui volessimo agire, invece, sull'array originale abbiamo la necessità di passare i valori per riferimento.
Approfondiremo nella sezione dedicata alle funzioni il significato della gestione delle variabili per riferimento e non per valore. Per ora è sufficiente sapere che è una modalità che ci consente di scrivere sull'array originale e di non perdere le modifiche effettuate. Per raggiungere questo scopo è necessario aggiungere la keyword &
prima del nome della variabile (nel nostro caso $eta
) ed automaticamente il codice precedente ci restituirà il risultato atteso:
$eta_utenti = array(
'Simone' => 29,
'Josephine' => 30,
'Giuseppe' => 23,
'Renato' => 26,
'Gabriele' => 24
);
foreach ($eta_utenti as $nome => &$eta) {
$eta++;
}
print_r($eta_utenti);
Al termine della compilazione, quindi, il risultato sarà:
Array
(
[Simone] => 30
[Josephine] => 31
[Giuseppe] => 24
[Renato] => 27
[Gabriele] => 25
)