Pergunta
É sobre PHP, mas não tenho dúvidas de que muitos dos mesmos comentários se aplicarão a outras linguagens.
Simplificando, quais são as diferenças nos diferentes tipos de loop para PHP?Um é mais rápido/melhor que os outros ou devo simplesmente colocar o loop mais legível?
for ($i = 0; $i < 10; $i++)
{
# code...
}
foreach ($array as $index => $value)
{
# code...
}
do
{
# code...
}
while ($flag == false);
Solução
Os loops For e While são loops de condição de entrada.Eles avaliam a condição primeiro, de modo que o bloco de instruções associado ao loop não será executado nem uma vez se a condição não for atendida
As instruções dentro deste bloco de loop for serão executadas 10 vezes, o valor de $i será de 0 a 9;
for ($i = 0; $i < 10; $i++)
{
# code...
}
A mesma coisa feita com o loop while:
$i = 0;
while ($i < 10)
{
# code...
$i++
}
O loop Do-while é um loop de condição de saída.É garantido que será executado uma vez, então avaliará a condição antes de repetir o bloco
do
{
# code...
}
while ($flag == false);
foreach é usado para acessar os elementos do array do início ao fim.No início do loop foreach, o ponteiro interno do array é definido para o primeiro elemento do array, na próxima etapa ele é definido para o segundo elemento do array e assim por diante até o array terminar.No bloco de loop, o valor do item atual da matriz está disponível como $value e a chave do item atual está disponível como $index.
foreach ($array as $index => $value)
{
# code...
}
Você poderia fazer a mesma coisa com o loop while, assim
while (current($array))
{
$index = key($array); // to get key of the current element
$value = $array[$index]; // to get value of current element
# code ...
next($array); // advance the internal array pointer of $array
}
E por fim: O manual do PHP é seu amigo :)
Outras dicas
Este é o CS101, mas como ninguém mais o mencionou, os loops while avaliam sua condição antes do bloco de código e o do-while avalia após o bloco de código, portanto, os loops do-while têm sempre a garantia de executar seu bloco de código pelo menos uma vez, independentemente da condição.
@brendan:
O artigo que você citou está seriamente desatualizado e as informações estão completamente erradas.Especialmente o último ponto (use for
em vez de foreach
) é enganoso e a justificativa oferecida no artigo não se aplica mais às versões modernas do .NET.
Embora seja verdade que o IEnumerator
usa chamadas virtuais, estas pode na verdade, ser incorporado por um compilador moderno.Além disso, o .NET agora conhece enumeradores genéricos e fortemente tipados.
Existem muitos testes de desempenho por aí que provam conclusivamente que for
geralmente não é mais rápido que foreach
. Aqui está um exemplo.
Eu uso o primeiro loop ao iterar sobre um array convencional (indexado?) E o loop foreach ao lidar com um array associativo.Parece natural e ajuda o código a fluir e a ser mais legível, na minha opinião.Quanto aos loops do...while, eu os uso quando preciso fazer mais do que apenas percorrer um array.
Não tenho certeza de nenhum benefício de desempenho.
O desempenho não é significativamente melhor em nenhum dos casos.Embora seja útil para tarefas mais complexas do que iterar, mas for
e while
são funcionalmente equivalentes.
Foreach
é bom, mas tem uma ressalva importante:você não é possível modificar o enumerável que você está iterando.Portanto, não é necessário remover, adicionar ou substituir entradas nele.Modificar entradas (como alterar suas propriedades) é aceitável, é claro.
Com um loop foreach, uma cópia do array original é feita na memória para uso interno.Você não deve usá-los em grandes estruturas;um loop for simples é uma escolha melhor.Você pode usar um loop while com mais eficiência em uma estrutura grande não indexada numericamente como esta:
while(list($key, $value) = each($array)) {
Mas essa abordagem é particularmente feia para uma estrutura simples e pequena.
while loops são mais adequados para percorrer fluxos, ou como no exemplo a seguir que você vê com muita frequência em PHP:
while ($row = mysql_fetch_array($result)) {
Quase sempre, os diferentes loops são intercambiáveis e tudo se resume a a) eficiência ou b) clareza.
Se você conhece as compensações de eficiência dos diferentes tipos de loops, então sim, para responder à sua pergunta original:use aquele que parece mais limpo.
Cada construção de loop serve a um propósito diferente.
for - Isso é usado para fazer um loop para um número específico de iterações.
foreach - Isso é usado para percorrer todos os valores em uma coleção.
while - Isso é usado para fazer um loop até que você atenda a uma condição.
Dos três, “enquanto” provavelmente proporcionará o melhor desempenho na maioria das situações.É claro que, se você fizer algo como o seguinte, estará basicamente reescrevendo o loop "for" (que em c# tem um desempenho um pouco melhor).
$count = 0;
do
{
...
$count++;
}
while ($count < 10);
Todos eles têm finalidades básicas diferentes, mas também podem ser usados da mesma maneira.Depende completamente do problema específico que você está tentando resolver.
Com um loop foreach, uma cópia do array original é feita na memória para uso interno.
Foreach é bom, mas tem uma ressalva importante:você não pode modificar o enumerável que está iterando.
Ambos não serão um problema se você passar por referência em vez de valor:
foreach ($array as &$value) {
Acho que isso é permitido desde o PHP 5.
Ao acessar os elementos de um array, para maior clareza eu usaria um foreach sempre que possível, e só usaria um for se você precisasse dos valores reais do índice (por exemplo, o mesmo índice em vários arrays).Isso também minimiza a chance de erros de digitação, já que os loops for tornam tudo muito fácil.Em geral, PHP pode não ser o lugar para se preocupar muito com desempenho.E por último, mas não menos importante, for e foreach têm (ou deveriam ter;Eu não sou um PHP-er) no mesmo tempo Big-O (O (n)), então você está possivelmente olhando para uma pequena quantidade a mais de uso de memória ou um ligeiro impacto constante ou linear no tempo.
Em relação ao desempenho, um foreach consome mais do que um for