Introdução: A eterna questão do foreach e seu índice
\n\nSe você já programou em PHP, certamente já passou por esta situação: precisa não apenas percorrer os elementos de um array, mas também saber o número da iteração atual. Parece simples, não é? Mas é exatamente esta pergunta — "How to find the foreach index?" — que acumula milhares de visualizações no Stack Overflow. E não é à toa!
\n\nEm 2025, com o PHP continuando a evoluir e os projetos se tornando mais complexos, entender como trabalhar corretamente com índices no loop foreach não é um luxo, mas uma necessidade. Disso dependem a legibilidade do código, seu desempenho e a facilidade de manutenção para seu colega (ou para você mesmo daqui a seis meses).
Neste artigo, vamos explorar três formas comprovadas de obter o índice do elemento no foreach, mostrar exemplos reais de código, discutir as armadilhas e dar recomendações que você pode aplicar hoje mesmo. Vamos lá!
Método nº1: Usando as chaves do array (o mais elegante)
\n\nA forma mais simples e "nativa" do PHP é usar a sintaxe foreach ($array as $key => $value). Ela não requer variáveis ou funções extras e funciona com qualquer tipo de array, seja com chaves numéricas ou arrays associativos.
Como funciona?
\nImagine que você tem um array de usuários:
\n\n<?php\n$users = ['Alice', 'Bob', 'Charlie', 'Diana'];\n\nforeach ($users as $index => $name) {\n echo "Usuário #{$index}: {$name}<br>";\n}\n?>\n\nO resultado será:
\nUsuário #0: Alice\nUsuário #1: Bob\nUsuário #2: Charlie\nUsuário #3: Diana\n\nObserve: $index não é apenas um contador. É a chave real do array. Se o array tiver chaves não padrão (por exemplo, strings), $index conterá exatamente essas chaves.
Quando usar?
\n- \n
- Sempre que possível. É a forma mais legível e performática. \n
- Quando você não precisa reiniciar o contador ou gerenciá-lo manualmente. \n
- Para qualquer tipo de array: listas ou associativos. \n
Armadilha
\nSe o array tiver "buracos" nos índices (por exemplo, após remover um elemento), $index será igual à chave real, não ao número sequencial. Exemplo:
<?php\n$fruits = [0 => 'maçã', 2 => 'banana', 5 => 'cereja'];\n\nforeach ($fruits as $key => $fruit) {\n echo "Chave: {$key}, fruta: {$fruit}<br>";\n}\n?>\n\nResultado:
\nChave: 0, fruta: maçã\nChave: 2, fruta: banana\nChave: 5, fruta: cereja\n\nSe você precisa de um número sequencial (0, 1, 2), este método não serve — é preciso usar a segunda opção.
\n\nMétodo nº2: Contador manual (flexibilidade e controle)
\n\nA abordagem clássica é criar uma variável contadora e incrementá-la a cada iteração. Isso dá controle total sobre a numeração.
\n\nExemplo básico
\n\n<?php\n$items = ['livro', 'caneta', 'caderno', 'lápis'];\n$counter = 0;\n\nforeach ($items as $item) {\n echo "Item #{$counter}: {$item}<br>";\n $counter++;\n}\n?>\n\nResultado:
\nItem #0: livro\nItem #1: caneta\nItem #2: caderno\nItem #3: lápis\n\nContador começando em 1
\nMuitas vezes é necessário exibir a numeração começando em 1 para o usuário. É fácil fazer:
\n\n<?php\n$tasks = ['Lavar louça', 'Passear com o cachorro', 'Fazer lição de casa'];\n$taskNumber = 1;\n\nforeach ($tasks as $task) {\n echo "Tarefa nº{$taskNumber}: {$task}<br>";\n $taskNumber++;\n}\n?>\n\nControle condicional do contador
\nO contador manual permite pular elementos ou reiniciar a numeração:
\n\n<?php\n$numbers = [1, 2, 0, 3, 4, 0, 5];\n$v