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?

user18334
la source

Réponses:

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

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

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

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

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

Mikel Williams
la source
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.

The Brawny Man
la source
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).

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