¿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?

usuario18334
fuente

Respuestas:

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

$keyes el índice de cada $arrayelemento

Owen
fuente
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++;
}
ConroyP
fuente
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.

Bailey Parker
fuente
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
}
Zoredache
fuente
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.

Ólafur Waage
fuente
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;
}
Trev
fuente
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

Mikel Williams
fuente
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.

El hombre musculoso
fuente
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).

algo
fuente
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
}
Randy Greencorn
fuente
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
Taranis
fuente
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
Carlos Cavalchuki
fuente
-1
foreach(array_keys($array) as $key) {
//  do stuff
}
gdmanandamohon
fuente