Manual do PHP
Anterior | Capítulo 16. Estruturas de Controle | Próxima

# `foreach`

O PHP4 inclui um construtor `foreach`, muito parecido com o PERL e outras linguagens. Isto oferece uma maneira fácil de iterar sobre matrizes. `foreach` funciona somente com arrays, e lançará um erro se tentar utilizá-lo em uma variável de qualquer tipo diferente ou em variáveis não inicializadas. Há duas sintaxes; a segunda é uma abreviatura, mas bem útil do que primeira:

    foreach (expressao_array as $valor)
      instrucoes
    foreach (expressao_array as $chave => $valor)
     instrucoes

A primeira forma varre uma dada matriz dada por `expressao_array`. Em cada 'loop', o valor do elemento corrente é atribuído a `$valor` e o ponteiro interno da matriz é avançado em uma posição (assim, no próxima iteração você estará olhando para o próximo elemento).

A segunda forma faz a mesma coisa, exceto pelo fato de que a chave do elemento atual será atribuído à variável `$chave` em cada iteração.

A partir do PHP 5, é posivel iterar objetos também.

> Nota: Quando o `foreach` inicia sua primeira execução, o ponteiro interno da matriz é zerado automaticamente para o primeiro elemento do array. Isto significa que você não precisa chamar reset() antes de um loop `foreach` .

> Nota: Note também que `foreach` opera sobre uma cópia do array especificado, não o próprio array, e portanto, o ponteiro do array original não é modificado como na instrução each(), que altera o elemento do array selecionado, mas isso não se reflete o array original. Entretanto, o ponteiro interno do array original é movimentado pelo processamento do array. Assumindo que o laço foreach rode até o fim, o ponteiro interno do array estará posicionado no fim do array.

A partir do PHP 5, você pode modificar facilmente modificar os elementos da matriz precedendo `$value` com &. Isto irá definir uma referencia ao invés de copiar o valor.

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

Isto é possível apenas se a matriz interada puder ser referencia (ex. é variável).

> Nota: `foreach` tem a habilidade de evitar mensagens de erro com '@'.

Você pode ter notado que os seguintes itens são funcionalmente idênticos:

`<?php $arr = array("um", "dois", "três"); reset ($arr); while (list(, $value) = each ($arr)) { echo "Valor: $value<br />\n"; } foreach ($arr as $value) { echo "Valor: $value<br />\n"; } ?>`

Os seguintes também são funcionalmente idênticos:

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

Mais alguns exemplos para demonstrar os usos:

`<?php /* exemplo foreach 1: somente valores */ $a = array(1, 2, 3, 17); foreach ($a as $v) { echo "Valor atual de \$a: $v.\n"; } /* exemplo foreach 2: valores (com as chaves impressas para ilustração) */ $a = array(1, 2, 3, 17); $i = 0; /* para exemplo somente */ foreach ($a as $v) { echo "\$a[$i] => $v.\n"; $i++; } /* exemplo foreach 3: chaves e valores */ $a = array ( "um" => 1, "dois" => 2, "três" => 3, "dezessete" => 17 ); foreach ($a as $k => $v) { echo "\$a[$k] => $v.\n"; } /* exemplo foreach 4: arrays multidimensionais */ $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"; } } /* exemplo foreach 5: arrays dinâmicos */ foreach (array(1, 2, 3, 4, 5) as $v) { echo "$v\n"; } ?>`

Anterior | Principal | Próxima
`for` | Acima | `break`