Como identificar o primeiro e último elemento no foreach? 3 métodos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Primeiro e último no loop foreach: a dor de cabeça eterna do desenvolvedor PHP

\n\n

Imagine a situação: você está exibindo uma lista de produtos em uma loja virtual. O primeiro produto deve ter o selo "Mais Vendido", e o último, "Lançamento". Ou, digamos, você está gerando um feed XML onde os elementos precisam ser envolvidos em tags-container, mas apenas para o primeiro e o último elemento. Como fazer isso em PHP? Parece uma tarefa simples, mas no Stack Overflow essa pergunta já acumulou milhares de visualizações e dezenas de soluções diferentes.

\n\n

Por que um problema aparentemente tão simples gera tanta discussão? Tudo porque o foreach no PHP é um iterador que não oferece métodos nativos para identificar o número da iteração. Diferente do loop for, onde temos um contador $i, no foreach lidamos apenas com chave e valor. E é aí que a mágica acontece: alguns usam contadores, outros usam as funções reset() e end(), e outros apelam para truques com ponteiros de array.

\n\n

Neste artigo, vamos explorar três abordagens principais para identificar a primeira e a última iteração no foreach, comparando desempenho, legibilidade e confiabilidade. Você descobrirá qual método escolher para cada situação e como evitar erros comuns. Vamos nessa!

\n\n

Método 1: O clássico contador (o mais intuitivo)

\n\n

A maneira mais direta é criar uma variável contadora e compará-la com o total de elementos do array. Esse método é conhecido como "o da vovó", mas funciona perfeitamente.

\n\n
<?php\n$items = ['maçã', 'banana', 'cereja', 'melão'];\n$total = count($items);\n$counter = 0;\n\nforeach ($items as $item) {\n    $counter++;\n    if ($counter === 1) {\n        echo "<strong>Primeiro: $item</strong><br>";\n    } elseif ($counter === $total) {\n        echo "<em>Último: $item</em><br>";\n    } else {\n        echo "$item<br>";\n    }\n}\n?>
\n\n

Vantagens:

\n
    \n
  • Lógica extremamente clara — qualquer iniciante entende o código de primeira.
  • \n
  • Não depende do tipo das chaves do array (funciona tanto com arrays associativos quanto numéricos).
  • \n
  • Fácil de modificar: quer verificar a segunda ou a penúltima iteração? Basta ajustar a condição.
  • \n
\n\n

Desvantagens:

\n
    \n
  • Requer a chamada de count() para todo o array — um micro-overhead, mas em arrays enormes (milhões de elementos) pode ser perceptível.
  • \n
  • É preciso lembrar de inicializar o contador antes do loop.
  • \n
  • Se o array estiver vazio, $total será 0, e a condição $counter === $total nunca será verdadeira (o que é lógico, mas iniciantes costumam esquecer disso).
  • \n
\n\n

Método 2: O truque com reset() e end() (para quem ama código enxuto)

\n\n

O PHP possui as funções reset(), que retorna o primeiro elemento do array, e end(), que retorna o último. A sacada é comparar o elemento atual com esses valores dentro do loop.

\n\n
<?php\n$items = ['maçã', 'banana', 'cereja', 'melão'];\n$first = reset($items);\n$last = end($items);\n\nforeach ($items as $item) {\n    if ($item === $first) {\n        echo "<strong>Primeiro: $item</strong><br>";\n    } elseif ($item === $last) {\n        echo "<em>Último: $item</em><br>";\n    } else {\n        echo "$item<br>";\n    }\n}\n?>
\n\n

Vantagens:

\n
    \n
  • Código bem compacto e "elegante".
  • \n
  • Não precisa de contador nem de count().
  • \n
\n\n

Desvantagens:

\n
    \n
  • Principal armadilha: se o array tiver valores duplicados, o método falha. Imagine que o primeiro e o terceiro elemento são iguais. O código vai interpretar o terceiro como se fosse o primeiro também.
  • \n
  • reset()

Blogs

Book Recommendations