Wie finde ich den foreach-Index?

490

Ist es möglich, den foreachIndex zu finden ?

in einer forSchleife wie folgt:

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

$i gibt Ihnen den Index.

Muss ich die forSchleife verwenden oder gibt es eine Möglichkeit, den Index in die foreachSchleife zu bekommen ?

user18334
quelle

Antworten:

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

$keyist der Index jedes $arrayElements

Owen
quelle
2
Kommt darauf an, was das OP unter Index versteht: <? $ a = Array (3,5, 'xx', 4312, 'sasas'); nicht gesetzt ($ a [3]); foreach ($ a als $ k => $ v) print "\ $ k = $ k und \ $ v = $ v"; ?>
Milen A. Radev
9
definitiv, diese Frage ist nicht sehr spezifisch, ich habe es so verstanden, dass das OP die Syntax $ key => $ value weitgehend nicht kannte
Owen
38
Nun, das ist eigentlich richtig, sollte aber nicht die akzeptierte Antwort sein, da der Schlüssel auch eine Zeichenfolge sein kann. $myarr['foo'] = 'bar';
Angenommen
12
@Bison Sie haben Recht in der Bedeutung, dass es nicht fehlschlägt. Die OP-Frage wird jedoch nicht erfüllt. Er sucht nach numerischen Werten wie dem n-ten Element.
Toskan
3
Wie @Toskan sagt, sollte dies nicht die akzeptierte Antwort sein. Ich denke, es ist besser, einfach eine Variable außerhalb der Schleife zu erstellen und von dort aus zu zählen und sie bei vatiable++;jeder Iteration zu erhöhen . Der traditionelle Weg, hat aber immer funktioniert.
Jomar Sevillejo
172

Sie können einen Hack in Ihr foreachFeld einfügen, z. B. ein Feld, das bei jedem Durchlauf inkrementiert wird. Genau das forgibt Ihnen die Schleife in einem numerisch indizierten Array. Ein solches Feld wäre ein Pseudoindex, der manuell verwaltet werden muss (Inkremente usw.).

A foreachgibt Ihnen Ihren Index in Form Ihres $keyWertes, so dass ein solcher Hack nicht notwendig sein sollte.

zB in a 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
quelle
127
Ein in einer Schleife inkrementierter Wert ist kaum ein "Hack".
Thomas McCabe
17
@ThomasMcCabe Man könnte sogar sagen, es ist eine der Hauptanwendungen für eine Schleife.
Byson
26

Es ist zu beachten, dass Sie key()jedes Array aufrufen können, um den aktuellen Schlüssel zu finden. Wie Sie sich vorstellen können, current()wird der aktuelle Wert zurückgegeben und next()der Zeiger des Arrays auf das nächste Element verschoben.

Bailey Parker
quelle
Dies sollte nützlich sein, wenn Sie ein einfaches altes assoziatives PHP-Array zum Speichern von Daten verwenden möchten, die über die Iterable-Schnittstelle verfügbar gemacht werden sollen (wo Sie verfolgen müssen, wo Sie sich in einer Schleife befinden).
Peter
2
+1 für die Alternative, aber ein Funktionsaufruf in jeder Iteration ist etwas schwerer als die Verwendung vorab zugewiesener Variablen (dh die Verwendung von $keyfrom $key=>$value) ... Ich wette jedoch, dass die geringere Leistung in einer einfachen Schleife nicht signifikant / wahrnehmbar ist.
Armfoot
20

Owen hat eine gute Antwort. Wenn Sie nur den Schlüssel möchten und mit einem Array arbeiten, kann dies ebenfalls nützlich sein.

foreach(array_keys($array) as $key) {
//  do stuff
}
Zoredache
quelle
4
Und wenn Sie den Index brauchen , foreach(array_keys($array) as $index=>$key).
Leo
14

Sie können $iaußerhalb der Schleife erstellen und $i++am unteren Rand der Schleife ausführen.

Ólafur Waage
quelle
16
Es ist wichtig zu beachten, dass dieser Ansatz die aktuelle Iteration der Schleife angibt, NICHT den aktuellen Index des iterierten Arrays.
Peter Bailey
8

Diese beiden Schleifen sind gleichwertig (abgesehen von den Sicherheitsgeländern natürlich):

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

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

z.B

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

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}
Trev
quelle
17
Nicht, wenn es sich um ein assoziatives Array handelt
JoeCortopassi
8

Ich denke, die beste Option ist dieselbe:

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

es ist einfach und normal

Mikel Williams
quelle
Funktioniert wie ein Zauber
Steve Nosse
5

Jonathan ist richtig. PHP-Arrays fungieren als Zuordnungstabelle für Zuordnungstasten zu Werten. In einigen Fällen können Sie einen Index erhalten, wenn Ihr Array definiert ist, z

$var = array(2,5);

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

Ihre Ausgabe wird sein

2
5

In diesem Fall hat jedes Element im Array einen erkennbaren Index, aber wenn Sie dann etwas wie das Folgende tun

$var = array_push($var,10);

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

Sie erhalten keine Ausgabe. Dies liegt daran, dass Arrays in PHP keine linearen Strukturen sind, wie sie in den meisten Sprachen vorkommen. Sie ähneln eher Hash-Tabellen, die möglicherweise Schlüssel für alle gespeicherten Werte enthalten oder nicht. Daher verwendet foreach keine Indizes, um über sie zu crawlen, da sie nur dann einen Index haben, wenn das Array definiert ist. Wenn Sie einen Index benötigen, stellen Sie sicher, dass Ihre Arrays vollständig definiert sind, bevor Sie über sie kriechen, und verwenden Sie eine for-Schleife.

Der bullige Mann
quelle
Ja, aus diesem Grund müssen wir in PHP Arrays nach Schlüsseln und nicht nach Indizes "verbinden". Siehe auch array_map ( func , $ a, $ b).
Peter Krauss
Ops, lieber Leser und @TheBrawnyMan, denken Sie auch daran, dass Ihr Beispiel wie ein array_push () -Fehler (!) Ist . Die Empfehlung ist zu verwenden $var[] = 10;(siehe PHP-Link zur Anleitung), sodass die zweite forSchleife die erwarteten Ergebnisse ausgibt.
Peter Krauss
4

PHP-Arrays haben interne Zeiger. Versuchen Sie Folgendes:

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

Funktioniert für mich in Ordnung (allerdings nur sehr vorläufig getestet).

etw
quelle
1

Normalerweise mache ich das, wenn ich mit assoziativen Arrays arbeite:

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

Dies funktioniert auch mit nicht assoziativen Arrays. $ key ist der Indexwert. Wenn Sie es vorziehen, können Sie dies auch tun:

foreach ($array as $indx => $value) {
  //do something
}
Randy Greencorn
quelle
4
Wofür ist die "Alternative"? Sie wissen, dass dies abgesehen von den Variablennamen dasselbe ist? Also der letzte Satz und Codeblock ist unnötig, würde ich sagen - wenn es etwas tut, verwirrt es nur ..
Dennis98
@ Dennis98 Der Unterschied besteht darin, dass einer von ihnen ein assoziatives Array als Eingabe und der andere ein numerisches Array hat. Obwohl ich denke, es wäre besser, wenn die Antwort etwas ausführlicher wäre.
I_ATE_YOUR_WORK_FILES
0

Ich möchte dies hinzufügen, ich habe dies in Laravel verwendet, um nur meine Tabelle zu indizieren:

  • Mit $ loop-> index
  • Ich inkrementiere es auch mit ++ $ loop, um bei 1 zu beginnen

Mein Code:

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach
Taranis
quelle
Diese Frage wurde nicht für Laravel gestellt. Die $loopVariable kann nicht verwendet werden, da sie nach allgemeinem PHP gefragt wird.
Özgür Can Karagöz
0

Ich habe diesen Weg gelöst, als ich den foreach-Index und den Wert im selben Kontext verwenden musste:

$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
quelle
-1
foreach(array_keys($array) as $key) {
//  do stuff
}
gdmanandamohon
quelle