foreach
La parola chiave "foreach" è un costrutto di ciclo in PHP usato per iterare su array e oggetti. In questo articolo ne esploriamo sintassi e utilizzo.
Il ciclo foreach in PHP
foreach è il ciclo dedicato di PHP per iterare su array e object. A differenza di un ciclo for, non richiede un contatore né un indice — percorre ogni elemento automaticamente, uno alla volta, rendendolo il modo più comune e meno soggetto a errori per elaborare una collezione in PHP.
Questo capitolo tratta le due forme di foreach, l'iterazione per riferimento, il destructuring di array annidati con list(), la problematica più comune e quando preferire foreach rispetto agli altri cicli PHP.
Sintassi
foreach ha due forme.
Solo valore — quando interessa soltanto il valore di ogni elemento:
foreach ($array as $value) {
// do something with $value
}Chiave e valore — quando serve anche la chiave dell'array (indispensabile per gli array associativi):
foreach ($array as $key => $value) {
// do something with $key and $value
}Ad ogni iterazione, PHP copia l'elemento corrente in $value (e la sua chiave in $key), poi avanza all'elemento successivo fino a esaurire l'array.
Iterare un array indicizzato
Iterare un array associativo
Con la forma $key => $value si ottengono entrambe le metà di ogni coppia:
<?php
$person = ["name" => "John", "age" => 30, "city" => "New York"];
foreach ($person as $key => $value) {
echo $key . ": " . $value . PHP_EOL;
}
// Output:
// name: John
// age: 30
// city: New YorkModificare i valori per riferimento
Per impostazione predefinita $value è una copia, quindi modificarlo all'interno del ciclo non influisce sull'array originale. Aggiungendo il prefisso & si itera per riferimento e le modifiche vengono riscritte nell'array:
<?php
$prices = [10, 20, 30];
foreach ($prices as &$price) {
$price *= 2; // modifies the array in place
}
unset($price); // important: break the reference
print_r($prices);
// Output:
// Array
// (
// [0] => 20
// [1] => 40
// [2] => 60
// )Attenzione: eseguire sempre
unset($price)dopo un ciclo per riferimento. La variabile punta ancora all'ultimo elemento, quindi un'assegnazione successiva a$price— o un secondoforeachche riusa lo stesso nome — corromperebbe silenziosamente l'array.
Destrutturare array annidati con list()
Quando ogni elemento è a sua volta un array, è possibile destrutturarlo inline con list() (o con la sintassi abbreviata [] disponibile da PHP 7.1+):
<?php
$points = [[1, 2], [3, 4], [5, 6]];
foreach ($points as [$x, $y]) {
echo "x=$x, y=$y" . PHP_EOL;
}
// Output:
// x=1, y=2
// x=3, y=4
// x=5, y=6Quando usare foreach
- Usa
foreachper qualsiasi array o iterabile di cui vuoi ogni elemento — è la scelta più chiara e non rischia di uscire dai limiti dell'array. - Usa un ciclo
forquando hai bisogno di un controllo preciso sul contatore (saltare elementi, avanzare di 2, contare a ritroso). - Usa
whilequando il numero di iterazioni non è noto in anticipo e dipende da una condizione.
È anche possibile uscire anticipatamente da un foreach con break o saltare un'iterazione con continue, esattamente come negli altri cicli.