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);
Foi útil?

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

http://forums.asp.net/p/1041090/1457897.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top