Forum und email

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, é possível 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. foreach tem é semelhante um array de ponteiros. Não confie no ponteiro do array durante ou após o foreach sem resetá-lo.

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

<?php
$arr 
= array(1234);
foreach (
$arr as &$value) {
    
$value $value 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // quebra a referência com o último elemento
?>
Isto é possível apenas se a matriz iterada puder ser referenciada (isto é, uma variável).

Aviso

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

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(12317);

foreach (
$a as $v) {
   echo 
"Valor atual de \$a: $v.\n";
}

/* exemplo foreach 2: valores (com as chaves impressas para ilustração) */

$a = array(12317);

$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(12345) as $v) {
    echo 
"$v\n";
}
?>