¿Cómo encontrar el índice foreach?


490

¿Es posible encontrar el foreachíndice?

en un forbucle de la siguiente manera:

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

$i te dará el índice.

¿Tengo que usar el forbucle o hay alguna forma de obtener el índice en el foreachbucle?

Respuestas:


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

$keyes el índice de cada $arrayelemento


2
Depende de lo que el OP quiere decir por índice: <? $ a = array (3,5, 'xx', 4312, 'sasas'); sin establecer ($ a [3]); foreach ($ a como $ k => $ v) imprimir "\ $ k = $ k y \ $ v = $ v"; ?>
Milen A. Radev

99
Definitivamente, esta pregunta no es muy específica, supuse que el OP desconocía en gran medida la sintaxis $ key => $ value
Owen

38
bueno, esto es realmente correcto, pero no debería ser la respuesta aceptada, ya que la clave también puede ser una cadena. digamos que $myarr['foo'] = 'bar';falla este método
Toskan

12
@Bison tienes razón en el sentido de que no falla. Pero no cumple con la pregunta OP. Está buscando valores numéricos como el enésimo elemento.
Toskan

3
Como dice @Toskan, esta no debería ser la respuesta aceptada. Creo que es mejor crear una variable fuera del ciclo y contar desde allí, incrementándola con vatiable++;cada iteración. La forma tradicional, pero siempre ha funcionado.
Jomar Sevillejo

172

Puede poner un truco en su foreach, como un campo incrementado en cada recorrido, que es exactamente lo que forle da el bucle en una matriz indexada numéricamente. Tal campo sería un pseudo-índice que necesita gestión manual (incrementos, etc.).

A foreachle dará su índice en la forma de su $keyvalor, por lo que tal pirateo no debería ser necesario.

por ejemplo, en un 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++;
}

128
Tener un valor incrementado en un bucle no es un 'hack'.
Thomas McCabe

17
@ThomasMcCabe Incluso se podría decir que es uno de los usos principales de un bucle.
Byson

26

Cabe señalar que puede llamar key()a cualquier matriz para encontrar la clave actual. Como puede suponer current(), devolverá el valor actual y next()moverá el puntero de la matriz al siguiente elemento.


Esto debería ser útil si desea utilizar una matriz asociativa PHP simple y antigua para almacenar datos que se expondrán a través de la interfaz Iterable (donde debe realizar un seguimiento de dónde se encuentra en un bucle).
Peter

2
+1 para la alternativa, pero una llamada de función en cada iteración es un poco más pesada que usar variables preasignadas (es decir, usar $keyfrom $key=>$value) ... Sin embargo, apuesto a que el rendimiento más bajo no es significativo / perceptible en un bucle simple.
Armfoot

20

Owen tiene una buena respuesta. Si solo desea la clave, y está trabajando con una matriz, esto también podría ser útil.

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

44
Y si necesita el índice, foreach(array_keys($array) as $index=>$key).
Leo

14

Puede crear $ifuera del bucle y hacer $i++en la parte inferior del bucle.


16
Es importante tener en cuenta que este enfoque proporciona la iteración actual del bucle, NO el índice actual de la matriz iterada.
Peter Bailey

8

Estos dos bucles son equivalentes (excluye las barandillas de seguridad, por supuesto):

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

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

p.ej

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

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

17
No si es una matriz asociativa
JoeCortopassi

8

Creo que la mejor opción es la misma:

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

es facil y normalmente


Funciona como un encanto
Steve Nosse

5

Jonathan tiene razón. Las matrices PHP actúan como una tabla de asignación que asigna claves a valores. en algunos casos puede obtener un índice si su matriz está definida, como

$var = array(2,5);

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

su salida será

2
5

en cuyo caso cada elemento de la matriz tiene un índice que se puede conocer, pero si hace algo como lo siguiente

$var = array_push($var,10);

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

no obtienes salida. Esto sucede porque las matrices en PHP no son estructuras lineales como lo son en la mayoría de los lenguajes. Son más como tablas hash que pueden o no tener claves para todos los valores almacenados. Por lo tanto, foreach no usa índices para rastrearlos porque solo tienen un índice si la matriz está definida. Si necesita tener un índice, asegúrese de que sus matrices estén completamente definidas antes de rastrearlas y use un bucle for.


Sí, es por eso que en PHP debemos "unir matrices" por claves y no por índices ... Ver también array_map (func, $ a, $ b).
Peter Krauss

Ops, querido lector y @TheBrawnyMan, recuerde también que su ejemplo es como un error de array_push () (!). La recomendación es usar $var[] = 10;(vea el enlace PHP para guiar), por lo que el segundo forciclo genera los resultados esperados.
Peter Krauss

4

Las matrices PHP tienen punteros internos, así que intente esto:

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

Funciona bien para mí (aunque solo muy preliminarmente probado).


1

Normalmente hago esto cuando trabajo con matrices asociativas:

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

Esto funcionará bien con matrices no asociativas también. $ clave será el valor del índice. Si lo prefiere, también puede hacer esto:

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

44
¿Para qué es la 'alternativa'? ¿Sabes que esto es lo mismo, además de los nombres de las variables? Por lo que el último bloque de código frase y es innecesario, yo diría que - si se hace algo que sólo confunde ..
Dennis98

@ Dennis98 La diferencia es que uno de ellos tiene una matriz asociativa como entrada y el otro tiene una matriz numérica. Aunque supongo que sería mejor si la respuesta fuera un poco más detallada.
I_ATE_YOUR_WORK_FILES

0

Me gustaría agregar esto, lo usé en laravel para indexar mi tabla:

  • Con $ loop-> index
  • También lo preincremento con ++ $ loop para comenzar en 1

Mi código:

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

Esta pregunta no se hizo para laravel. La $loopvariable no se puede usar porque se le pide PHP general.
Özgür Can Karagöz

0

Resolví de esta manera, cuando tuve que usar el índice y el valor foreach en el mismo 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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.