Manuale PHP
Indietro | Capitolo 16. Strutture di controllo | Avanti

# foreach

PHP 4 (non PHP 3) permette l'uso della struttura di controllo foreach, alla stessa maniera del linguaggio Perl e altri. Ciò semplicemente fornisce una facile metodo per attraversare un array. foreach funziona solo con le matrici e genera un errore se si tenta di utilizzarlo con variabili di tipo diffente oppure non inizializzate. Esistono due possibili notazioni sintattiche; la seconda è un'utile estensione della prima:

    foreach(array_expression as $value)
          istruzione
    foreach(array_expression as $key => $value) i
          struzione

La prima attraversa l'array dato da array_expression. Ad ogni ciclo, si assegna il valore dell'elemento corrente a $value e il puntatore interno avanza di una posizione (in modo tale che al ciclo successivo l'elemento corrente sarà il successivo elemento dell'array).

La seconda esegue lo stesso ciclo con la differenza che il valore dell'indice corrente viene assegnato ad ogni ciclo, alla variabile $key.

Dal PHP sono anche possibili cicli sugli oggetti.

> Nota: All'inizio dell'esecuzione di un ciclo foreach il puntatore interno viene automaticamente posizionato nella prima posizione. Questo significa che non è necessario utilizzare la funzione reset() prima di un ciclo foreach.

> Nota: A meno che la matrice non sia per riferimento, foreach agisce su una copia e non sulla matrice stessa. Pertanto il puntatore dell'array originale non viene modificato come accade utilizzando la funzione each() e le modifiche agli elementi dell'array non appaiono nell'array originale. Tuttavia il puntatore interno della matrice originale viene avanzato durante l'elaborazione della matrice. Se si assume che il ciclo foreach giunga al termine, allorasi avrà che il puntatore interno della matrcie sarà al termine della matrice stessa.

> Dal PHP 5 si può modificare facilmente gli elementi di una matrice anteponendo & a $value with &. Questo assegna un riferimento anzichè copiare il valore.

> `<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr vale ora array(2, 4, 6, 8) ?>`

> Questo è possibile soltanto se l'array indicato può essere referenziato (ad esempio è una variabile).

> Nota: foreach non offre la possibilità di annullare la generazione di messaggi d'errore utilizzando il carattere '@'.

Avete probabilmente notato che i due cicli seguenti sono identici da un punto di vista funzionale:

`<?php $arr = array("one", "two", "three"); reset ($arr); while (list(, $value) = each ($arr)) { echo "Valore: $value<br />\n"; } foreach ($arr as $value) { echo "Valore: $value<br />\n"; } ?>`

Allo stesso modo i due cicli seguenti sono identici:

`<?php $arr = array("one", "two", "three"); reset ($arr); while (list($key, $value) = each ($arr)) { echo "Chiave: $key; Valore: $value<br />\n"; } foreach ($arr as $key => $value) { echo "Chiave: $key; Valore: $value<br>\n"; } ?>`

Di seguito, altri esempi per mostrare possibili utilizzi:

`<?php
/* esempio 1 foreach: solo il valore */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Valore corrente di \$a: $v.\n";
}
/* esempio 2 foreach: valore (con la chiave stampata) */
$a = array(1, 2, 3, 17);
$i = 0; /* solo per un proposito illustrativo */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* esempio 3 foreach: chiave e valore */
$a = array(
"uno" => 1,
"due" => 2,
"tre" => 3,
"diciassette" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* esempio 4 foreach: array multidimensionali */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* esempio 5 foreach: array dinamici */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>`

Indietro | Partenza | Avanti
for | Risali | break