Como encontrar o índice foreach?


490

É possível encontrar o foreachíndice?

em um forloop da seguinte maneira:

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}

$i lhe dará o índice.

Preciso usar o forloop ou existe alguma maneira de obter o índice no foreachloop?

Respostas:


909
foreach($array as $key=>$value) {
    // do stuff
}

$keyé o índice de cada $arrayelemento


2
Depende do que o OP quer dizer com índice: <? $ a = array (3,5, 'xx', 4312, 'sasas'); não definido ($ a [3]); foreach ($ a como $ k => $ v) print "\ $ k = $ ke \ $ v = $ v"; ?>
Milen A. Radev

9
Definitivamente, essa questão não é muito específico, eu o levei para significar o OP foi em grande parte desconhece a tecla $ => $ value sintaxe
Owen

38
bem, isso está realmente certo, mas não deve ser a resposta aceita, pois key também pode ser uma string. digamos que você faz $myarr['foo'] = 'bar';este método falhar
Toskan

12
@ Bisonte, você está certo no sentido de que não falha. Mas ele não cumpre a pergunta do OP. Ele está procurando valores numéricos como o n-ésimo elemento.
Toskan

3
Como o @Toskan diz, essa não deve ser a resposta aceita. Eu acho que é melhor criar uma variável fora do loop e contar a partir daí, aumentando-a vatiable++;a cada iteração. A maneira tradicional, mas sempre funcionou.
Jomar Sevillejo 30/10/2015

172

Você pode colocar um hack no seu foreach, como um campo incrementado em cada execução, que é exatamente o que o forloop fornece em uma matriz indexada numericamente. Esse campo seria um pseudo-índice que precisa de gerenciamento manual (incrementos, etc.).

A foreachfornecerá seu índice na forma de seu $keyvalor; portanto, esse hack não deve ser necessário.

por exemplo, em um foreach

$index = 0;
foreach($data as $key=>$val) {
    // Use $key as an index, or...

    // ... manage the index this way..
    echo "Index is $index\n";
    $index++;
}

127
Ter um valor incrementado em um loop dificilmente é um 'hack'.
Thomas McCabe

17
@ThomasMcCabe Pode-se até dizer que é um dos principais usos de um loop.
Byson

26

Note-se que você pode chamar key()qualquer matriz para encontrar a chave atual ativada. Como você pode imaginar current(), retornará o valor atual e next()moverá o ponteiro do array para o próximo elemento.


Isso deve ser útil se você deseja usar uma matriz associativa PHP antiga e simples para armazenar dados que devem ser expostos por meio da interface Iterable (onde você precisa acompanhar onde está em um loop).
Peter

2
+1 para a alternativa, mas uma chamada de função em cada iteração é um pouco mais pesada do que usar variáveis ​​pré-atribuídas (ou seja, usar $keyfrom $key=>$value) ... No entanto, aposto que o desempenho mais baixo não é significativo / perceptível em um loop simples.
Armfoot 02/09/2015

20

Owen tem uma boa resposta. Se você deseja apenas a chave e está trabalhando com uma matriz, isso também pode ser útil.

foreach(array_keys($array) as $key) {
//  do stuff
}

4
E se você precisar do índice foreach(array_keys($array) as $index=>$key),.
Leo

14

Você pode criar $ifora do loop e fazer $i++na parte inferior do loop.


16
É importante observar que essa abordagem fornece a iteração atual do loop, NÃO o índice atual da matriz iterada.
27668 Peter Bailey

8

Esses dois loops são equivalentes (exceto as grades de segurança, é claro):

for ($i=0; $i<count($things); $i++) { ... }

foreach ($things as $i=>$thing) { ... }

por exemplo

for ($i=0; $i<count($things); $i++) {
    echo "Thing ".$i." is ".$things[$i];
}

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}

17
Não se é uma matriz associativa
JoeCortopassi

8

Eu acho que a melhor opção é a mesma:

foreach ($lists as $key=>$value) {
    echo $key+1;
}

é fácil e normalmente


Funciona como um encanto
Steve Nosse

5

Jonathan está correto. As matrizes PHP atuam como uma tabela de mapeamento de chaves para valores. em alguns casos, você pode obter um índice se sua matriz estiver definida, como

$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

sua saída será

2
5

nesse caso, cada elemento da matriz possui um índice que pode ser conhecido, mas se você fizer algo como o seguinte

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

você não obtém saída. Isso acontece porque matrizes no PHP não são estruturas lineares, como na maioria das linguagens. Eles são mais como tabelas de hash que podem ou não ter chaves para todos os valores armazenados. Portanto, o foreach não usa índices para rastrear sobre eles, porque eles só têm um índice se a matriz estiver definida. Se você precisar de um índice, verifique se suas matrizes estão totalmente definidas antes de rastrear sobre elas e use um loop for.


Sim, é por isso que no PHP devemos "juntar matrizes" por chaves e não por índices ... Veja também array_map (func, $ a, $ b).
Peter Krauss

Ops, caro leitor e @TheBrawnyMan, lembre-se também de que seu exemplo é como um bug array_push () (!). A recomendação é usar $var[] = 10;(consulte o link do PHP para orientar), portanto, o segundo forloop gera os resultados esperados.
Peter Krauss

4

As matrizes PHP têm ponteiros internos, então tente o seguinte:

foreach($array as $key => $value){
   $index = current($array);
}

Funciona bem para mim (embora apenas muito preliminarmente testado).


1

Normalmente, faço isso ao trabalhar com matrizes associativas:

foreach ($assoc_array as $key => $value) {
 //do something
}

Isso também funcionará bem com matrizes não associativas. $ key será o valor do índice. Se preferir, você também pode fazer isso:

foreach ($array as $indx => $value) {
  //do something
}

4
Para que serve a 'alternativa'? Você sabe que é o mesmo, além dos nomes das variáveis? Assim, a última frase e código de bloco é desnecessário, eu diria - se ele faz qualquer coisa ele apenas confunde ..
Dennis98

@ Dennis98 A diferença é que um deles possui uma matriz associativa como entrada e o outro possui uma matriz numérica. Embora eu ache que seria melhor se a resposta fosse um pouco mais detalhada.
I_ATE_YOUR_WORK_FILES

0

Gostaria de acrescentar isso, usei isso no laravel apenas para indexar minha tabela:

  • Com $ loop-> index
  • Eu também pré-incremento com ++ $ loop para começar em 1

Meu código:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach

Esta pergunta não foi feita para laravel. A $loopvariável não pode ser usada porque é solicitado o PHP geral.
Özgür Can Karagöz

0

Eu resolvi dessa maneira, quando tive que usar o índice e o valor foreach no mesmo contexto:

$array = array('a', 'b', 'c');
foreach ($array as $letter=>$index) {

  echo $letter; //Here $letter content is the actual index
  echo $array[$letter]; // echoes the array value

}//foreach

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.