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 ?

Antworten:


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

$keyist der Index jedes $arrayElements


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++;
}

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.


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
}

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.


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;
}

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


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.


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).


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
}

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.