Comment trouver l'indice foreach?


490

Est-il possible de trouver l' foreachindex?

en forboucle comme suit:

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

$i vous donnera l'index.

Dois-je utiliser la forboucle ou existe-t-il un moyen d'obtenir l'index dans la foreachboucle?

Réponses:


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

$keyest l'indice de chaque $arrayélément


2
Dépend de ce que l'OP signifie par index: <? $ a = tableau (3,5, 'xx', 4312, 'sasas'); unset ($ a [3]); foreach ($ a as $ k => $ v) print "\ $ k = $ k and \ $ v = $ v"; ?>
Milen A. Radev

9
sans aucun doute, cette question n'est pas très spécifique, j'ai compris que l'OP ignorait en grande partie la syntaxe $ key => $ value
Owen

38
eh bien c'est vrai, mais ne devrait pas être la réponse acceptée, car la clé peut aussi être une chaîne. dire que vous faites $myarr['foo'] = 'bar';cette méthode échoue
Toskan

12
@Bison vous avez raison en ce sens qu'il n'échoue pas. Mais il ne répond pas à la question OP. Il recherche des valeurs numériques comme le n-ième élément.
Toskan

3
Comme le dit @Toskan, cela ne devrait pas être la réponse acceptée. Je pense qu'il vaut mieux simplement créer une variable en dehors de la boucle et compter à partir de là, en l'augmentant vatiable++;à chaque itération. La manière traditionnelle, mais a toujours fonctionné.
Jomar Sevillejo

172

Vous pouvez mettre un hack dans votre foreach, comme un champ incrémenté à chaque parcours, ce qui est exactement ce que la forboucle vous donne dans un tableau indexé numériquement. Un tel champ serait un pseudo-index nécessitant une gestion manuelle (incréments, etc.).

A foreachvous donnera votre index sous la forme de votre $keyvaleur, donc un tel hack ne devrait pas être nécessaire.

par exemple, dans 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
Avoir une valeur incrémentée dans une boucle n'est guère un «hack».
Thomas McCabe

17
@ThomasMcCabe On pourrait même dire que c'est l'une des principales utilisations d'une boucle.
Byson

26

Il convient de noter que vous pouvez appeler key()n'importe quel tableau pour trouver la clé actuelle activée. Comme vous pouvez le deviner current(), la valeur actuelle next()sera renvoyée et le pointeur du tableau sera déplacé vers l'élément suivant.


Cela devrait être utile si vous souhaitez utiliser un ancien tableau associatif PHP simple pour stocker des données qui doivent être exposées via l'interface Iterable (où vous devez garder une trace de l'endroit où vous êtes dans une boucle).
Peter

2
+1 pour l'alternative, mais un appel de fonction à chaque itération est un peu plus lourd que l'utilisation de variables pré-affectées (c'est-à-dire en utilisant le $keyfrom $key=>$value) ... Cependant, je parie que les performances inférieures sont non significatives / perceptibles dans une boucle simple.
Armfoot

20

Owen a une bonne réponse. Si vous ne voulez que la clé et que vous travaillez avec un tableau, cela peut également être utile.

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

4
Et si vous avez besoin de l'indice, foreach(array_keys($array) as $index=>$key).
Leo

14

Vous pouvez créer en $idehors de la boucle et faire $i++en bas de la boucle.


16
Il est important de noter que cette approche donne l'itération actuelle de la boucle, PAS l'indice actuel du tableau itéré.
Peter Bailey

8

Ces deux boucles sont équivalentes (sauf les garde-corps de sécurité bien sûr):

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

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

par exemple

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

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

17
Pas s'il s'agit d'un tableau associatif
JoeCortopassi

8

Je pense que la meilleure option est la même:

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

c'est facile et normalement


Fonctionne comme un charme
Steve Nosse

5

Jonathan a raison. Les tableaux PHP agissent comme une table de mappage des clés de correspondance avec les valeurs. dans certains cas, vous pouvez obtenir un index si votre tableau est défini, comme

$var = array(2,5);

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

votre sortie sera

2
5

auquel cas chaque élément du tableau a un index connaissable, mais si vous faites quelque chose comme le suivant

$var = array_push($var,10);

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

vous n'obtenez aucune sortie. Cela se produit car les tableaux en PHP ne sont pas des structures linéaires comme ils le sont dans la plupart des langages. Ils ressemblent davantage à des tables de hachage qui peuvent ou non avoir des clés pour toutes les valeurs stockées. Par conséquent, foreach n'utilise pas d'index pour les parcourir, car ils n'ont un index que si le tableau est défini. Si vous avez besoin d'un index, assurez-vous que vos tableaux sont entièrement définis avant de les parcourir et utilisez une boucle for.


Oui, c'est pourquoi en PHP il faut "joindre des tableaux" par clés et non par index ... Voir aussi array_map (func, $ a, $ b).
Peter Krauss

Ops, cher lecteur et @TheBrawnyMan, rappelez-vous aussi que votre exemple est comme un bug array_push () (!). La recommandation est d'utiliser $var[] = 10;(voir le lien PHP pour le guide), donc la deuxième forboucle sort les résultats attendus.
Peter Krauss

4

Les tableaux PHP ont des pointeurs internes, essayez donc ceci:

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

Fonctionne bien pour moi (seulement testé de manière très préliminaire cependant).


1

Je le fais normalement lorsque je travaille avec des tableaux associatifs:

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

Cela fonctionnera également très bien avec les tableaux non associatifs. $ key sera la valeur d'index. Si vous préférez, vous pouvez également le faire:

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

4
À quoi sert «l'alternative»? Vous savez que c'est la même chose, à part les noms de variables? Donc, la dernière phrase et le dernier bloc de code sont inutiles, je dirais - si ça fait quelque chose, cela confond simplement ..
Dennis98

@ Dennis98 La différence est que l'un d'eux a un tableau associatif en entrée et l'autre a un tableau numérique. Bien que je suppose que ce serait mieux si la réponse était un peu plus verbeuse.
I_ATE_YOUR_WORK_FILES

0

Je voudrais ajouter ceci, je l'ai utilisé dans laravel pour simplement indexer ma table:

  • Avec $ loop-> index
  • Je l'ai également pré-incrémenté avec ++ $ loop pour commencer à 1

Mon code:

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

Cette question n'a pas été posée pour laravel. La $loopvariable ne peut pas être utilisée car elle est demandée pour PHP général.
Özgür Can Karagöz

0

J'ai résolu de cette façon, quand j'ai dû utiliser l'index et la valeur foreach dans le même contexte:

$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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.