<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >foreach</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="Manual do PHP" HREF="index.html"><LINK REL="UP" TITLE="Estruturas de Controle" HREF="language.control-structures.html"><LINK REL="PREVIOUS" TITLE="for" HREF="control-structures.for.html"><LINK REL="NEXT" TITLE="break" HREF="control-structures.break.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="sect1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Manual do PHP</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="control-structures.for.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Capítulo 16. Estruturas de Controle</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="control-structures.break.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="control-structures.foreach" ><TT CLASS="literal" >foreach</TT ></A ></H1 ><P > O PHP4 inclui um construtor <TT CLASS="literal" >foreach</TT >, muito parecido com o PERL e outras linguagens. Isto oferece uma maneira fácil de iterar sobre matrizes. <TT CLASS="literal" >foreach</TT > 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: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN4715" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="programlisting" >foreach (expressao_array as $valor) instrucoes foreach (expressao_array as $chave => $valor) instrucoes</PRE ></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > A primeira forma varre uma dada matriz dada por <TT CLASS="literal" >expressao_array</TT >. Em cada 'loop', o valor do elemento corrente é atribuído a <TT CLASS="literal" >$valor</TT > 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). </P ><P > A segunda forma faz a mesma coisa, exceto pelo fato de que a chave do elemento atual será atribuído à variável <TT CLASS="literal" >$chave</TT > em cada iteração. </P ><P > A partir do PHP 5, é posivel <A HREF="language.oop5.iterations.html" >iterar objetos</A > também. </P ><P > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Quando o <TT CLASS="literal" >foreach</TT > 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 <A HREF="function.reset.html" ><B CLASS="function" >reset()</B ></A > antes de um loop <TT CLASS="literal" >foreach</TT > . </P ></BLOCKQUOTE ></DIV > </P ><P > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Note também que <TT CLASS="literal" >foreach</TT > 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 <A HREF="function.each.html" ><B CLASS="function" >each()</B ></A >, que altera o elemento do array selecionado, mas isso não se reflete o array original. Entretanto, o ponteiro interno do array original <SPAN CLASS="emphasis" ><I CLASS="emphasis" >é</I ></SPAN > 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. </P ></BLOCKQUOTE ></DIV > </P ><P > A partir do PHP 5, você pode modificar facilmente modificar os elementos da matriz precedendo <TT CLASS="literal" >$value</TT > com &. Isto irá definir uma <A HREF="language.references.html" >referencia</A > ao invés de copiar o valor. <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN4739" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$arr </font><font color="#007700">= array(</font><font color="#0000BB">1</font><font color="#007700">, </font><font color="#0000BB">2</font><font color="#007700">, </font><font color="#0000BB">3</font><font color="#007700">, </font><font color="#0000BB">4</font><font color="#007700">);<br />foreach (</font><font color="#0000BB">$arr </font><font color="#007700">as &</font><font color="#0000BB">$value</font><font color="#007700">) {<br /> </font><font color="#0000BB">$value </font><font color="#007700">= </font><font color="#0000BB">$value </font><font color="#007700">* </font><font color="#0000BB">2</font><font color="#007700">;<br />}<br /></font><font color="#FF8000">// $arr is now array(2, 4, 6, 8)<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > Isto é possível apenas se a matriz interada puder ser referencia (ex. é variável). </P ><P > <DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > <TT CLASS="literal" >foreach</TT > tem a habilidade de evitar mensagens de erro com '@'. </P ></BLOCKQUOTE ></DIV > </P ><P > Você pode ter notado que os seguintes itens são funcionalmente idênticos: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN4746" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$arr </font><font color="#007700">= array(</font><font color="#DD0000">"um"</font><font color="#007700">, </font><font color="#DD0000">"dois"</font><font color="#007700">, </font><font color="#DD0000">"três"</font><font color="#007700">);<br /></font><font color="#0000BB">reset </font><font color="#007700">(</font><font color="#0000BB">$arr</font><font color="#007700">);<br />while (list(, </font><font color="#0000BB">$value</font><font color="#007700">) = </font><font color="#0000BB">each </font><font color="#007700">(</font><font color="#0000BB">$arr</font><font color="#007700">)) {<br /> echo </font><font color="#DD0000">"Valor: $value<br /></font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /><br />foreach (</font><font color="#0000BB">$arr </font><font color="#007700">as </font><font color="#0000BB">$value</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"Valor: $value<br /></font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > Os seguintes também são funcionalmente idênticos: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN4748" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$arr </font><font color="#007700">= array(</font><font color="#DD0000">"one"</font><font color="#007700">, </font><font color="#DD0000">"two"</font><font color="#007700">, </font><font color="#DD0000">"three"</font><font color="#007700">);<br /></font><font color="#0000BB">reset</font><font color="#007700">(</font><font color="#0000BB">$arr</font><font color="#007700">);<br />while (list(</font><font color="#0000BB">$key</font><font color="#007700">, </font><font color="#0000BB">$value</font><font color="#007700">) = </font><font color="#0000BB">each </font><font color="#007700">(</font><font color="#0000BB">$arr</font><font color="#007700">)) {<br /> echo </font><font color="#DD0000">"Chave: $key; Valor: $value<br /></font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /><br />foreach (</font><font color="#0000BB">$arr </font><font color="#007700">as </font><font color="#0000BB">$key </font><font color="#007700">=> </font><font color="#0000BB">$value</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"Chave: $key; Valor: $value<br /></font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><P > Mais alguns exemplos para demonstrar os usos: <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN4751" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">/* exemplo foreach 1: somente valores */<br /><br /></font><font color="#0000BB">$a </font><font color="#007700">= array(</font><font color="#0000BB">1</font><font color="#007700">, </font><font color="#0000BB">2</font><font color="#007700">, </font><font color="#0000BB">3</font><font color="#007700">, </font><font color="#0000BB">17</font><font color="#007700">);<br /><br />foreach (</font><font color="#0000BB">$a </font><font color="#007700">as </font><font color="#0000BB">$v</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"Valor atual de </font><font color="#007700">\$</font><font color="#DD0000">a: $v.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /><br /></font><font color="#FF8000">/* exemplo foreach 2: valores (com as chaves impressas para ilustração) */<br /><br /></font><font color="#0000BB">$a </font><font color="#007700">= array(</font><font color="#0000BB">1</font><font color="#007700">, </font><font color="#0000BB">2</font><font color="#007700">, </font><font color="#0000BB">3</font><font color="#007700">, </font><font color="#0000BB">17</font><font color="#007700">);<br /><br /></font><font color="#0000BB">$i </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">; </font><font color="#FF8000">/* para exemplo somente */<br /><br /></font><font color="#007700">foreach (</font><font color="#0000BB">$a </font><font color="#007700">as </font><font color="#0000BB">$v</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"</font><font color="#007700">\$</font><font color="#DD0000">a</font><font color="#007700">[</font><font color="#DD0000">$i</font><font color="#007700">]</font><font color="#DD0000"> => $v.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br /> </font><font color="#0000BB">$i</font><font color="#007700">++;<br />}<br /><br /></font><font color="#FF8000">/* exemplo foreach 3: chaves e valores */<br /><br /></font><font color="#0000BB">$a </font><font color="#007700">= array (<br /> </font><font color="#DD0000">"um" </font><font color="#007700">=> </font><font color="#0000BB">1</font><font color="#007700">,<br /> </font><font color="#DD0000">"dois" </font><font color="#007700">=> </font><font color="#0000BB">2</font><font color="#007700">,<br /> </font><font color="#DD0000">"três" </font><font color="#007700">=> </font><font color="#0000BB">3</font><font color="#007700">,<br /> </font><font color="#DD0000">"dezessete" </font><font color="#007700">=> </font><font color="#0000BB">17<br /></font><font color="#007700">);<br /><br />foreach (</font><font color="#0000BB">$a </font><font color="#007700">as </font><font color="#0000BB">$k </font><font color="#007700">=> </font><font color="#0000BB">$v</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"</font><font color="#007700">\$</font><font color="#DD0000">a</font><font color="#007700">[</font><font color="#DD0000">$k</font><font color="#007700">]</font><font color="#DD0000"> => $v.</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /><br /></font><font color="#FF8000">/* exemplo foreach 4: arrays multidimensionais */<br /><br /></font><font color="#0000BB">$a </font><font color="#007700">= array();<br /></font><font color="#0000BB">$a</font><font color="#007700">[</font><font color="#0000BB">0</font><font color="#007700">][</font><font color="#0000BB">0</font><font color="#007700">] = </font><font color="#DD0000">"a"</font><font color="#007700">;<br /></font><font color="#0000BB">$a</font><font color="#007700">[</font><font color="#0000BB">0</font><font color="#007700">][</font><font color="#0000BB">1</font><font color="#007700">] = </font><font color="#DD0000">"b"</font><font color="#007700">;<br /></font><font color="#0000BB">$a</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">][</font><font color="#0000BB">0</font><font color="#007700">] = </font><font color="#DD0000">"y"</font><font color="#007700">;<br /></font><font color="#0000BB">$a</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">][</font><font color="#0000BB">1</font><font color="#007700">] = </font><font color="#DD0000">"z"</font><font color="#007700">;<br /><br />foreach (</font><font color="#0000BB">$a </font><font color="#007700">as </font><font color="#0000BB">$v1</font><font color="#007700">) {<br /> foreach (</font><font color="#0000BB">$v1 </font><font color="#007700">as </font><font color="#0000BB">$v2</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"$v2</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br /> }<br />}<br /><br /></font><font color="#FF8000">/* exemplo foreach 5: arrays dinâmicos */<br /><br /></font><font color="#007700">foreach (array(</font><font color="#0000BB">1</font><font color="#007700">, </font><font color="#0000BB">2</font><font color="#007700">, </font><font color="#0000BB">3</font><font color="#007700">, </font><font color="#0000BB">4</font><font color="#007700">, </font><font color="#0000BB">5</font><font color="#007700">) as </font><font color="#0000BB">$v</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"$v</font><font color="#007700">\n</font><font color="#DD0000">"</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="control-structures.for.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Principal</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="control-structures.break.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><TT CLASS="literal" >for</TT ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="language.control-structures.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><TT CLASS="literal" >break</TT ></TD ></TR ></TABLE ></DIV ></BODY ></HTML >