Jak znaleźć indeks Foreach?


489

Czy można znaleźć foreachindeks?

w forpętli, jak następuje:

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

$i da ci indeks.

Czy muszę korzystać z forpętli, czy jest jakiś sposób na uzyskanie indeksu w foreachpętli?

Odpowiedzi:


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

$keyjest indeksem każdego $arrayelementu


2
Zależy, co OP rozumie przez indeks: <? $ a = tablica (3,5, „xx”, 4312, „sasas”); rozbrojony ($ a [3]); foreach ($ a jako $ k => $ v) print "\ $ k = $ k i \ $ v = $ v"; ?>
Milen A. Radev

9
zdecydowanie, to pytanie nie jest zbyt szczegółowe, zrozumiałem, że OP było w dużej mierze nieświadome składni $ key => $ value
Owen

38
cóż, jest to w rzeczywistości słuszne, ale nie powinna być zaakceptowaną odpowiedzią, ponieważ klucz może być również łańcuchem. powiedzmy, że $myarr['foo'] = 'bar';ta metoda zawiedzie
Toskan

12
@Bison masz rację w tym sensie, że nie zawiedzie. Ale to nie odpowiada na pytanie PO. Szuka wartości liczbowych, takich jak n-ty element.
Toskan

3
Jak mówi @Toskan, nie powinna to być akceptowana odpowiedź. Myślę, że lepiej jest po prostu utworzyć zmienną poza pętlą i policzyć stamtąd, zwiększając ją z vatiable++;każdą iteracją. Tradycyjny sposób, ale zawsze działał.
Jomar Sevillejo

172

Możesz wprowadzić hak foreach, np. Pole zwiększane przy każdym przejściu, co jest dokładnie tym, co fordaje ci pętla w tablicy indeksowanej numerycznie. Takim polem byłby pseudoindeks, który wymaga ręcznego zarządzania (przyrosty itp.).

A foreachda ci indeks w postaci $keywartości, więc taki hack nie powinien być konieczny.

np. w 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
Zwiększanie wartości w pętli nie jest wcale „hackowaniem”.
Thomas McCabe,

17
@ThomasMcCabe Można nawet powiedzieć, że jest to jeden z podstawowych zastosowań pętli.
Byson,

26

Należy zauważyć, że możesz wywołać key()dowolną tablicę, aby znaleźć bieżący klucz. Jak można się domyślić current(), zwróci bieżącą wartość i next()przeniesie wskaźnik tablicy do następnego elementu.


Powinno to być przydatne, jeśli chcesz użyć zwykłej starej tablicy asocjacyjnej PHP do przechowywania danych, które mają być ujawniane przez interfejs Iterable (gdzie musisz śledzić, gdzie jesteś w pętli).
Peter

2
+1 dla alternatywy, ale wywołanie funkcji w każdej iteracji jest nieco cięższe niż przy użyciu wstępnie przypisanych zmiennych (tj. Przy użyciu $keyfrom $key=>$value) ... Założę się jednak, że niższa wydajność jest nieistotna / odczuwalna w prostej pętli.
Armfoot

20

Owen ma dobrą odpowiedź. Jeśli potrzebujesz tylko klucza i pracujesz z tablicą, może to być również przydatne.

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

4
A jeśli potrzebujesz indeksu foreach(array_keys($array) as $index=>$key).
Leo

14

Możesz tworzyć $ipoza pętlą i robić $i++na dole pętli.


16
Należy zauważyć, że takie podejście daje bieżącą iterację pętli, a NIE bieżący indeks iterowanej tablicy.
Peter Bailey,

8

Te dwie pętle są równoważne (oczywiście poza barierkami bezpieczeństwa):

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

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

na przykład

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

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

17
Nie, jeśli jest to tablica asocjacyjna
JoeCortopassi


5

Jonathan ma rację. Macierze PHP działają jak klucze mapujące tablice map do wartości. w niektórych przypadkach można uzyskać indeks, jeśli tablica jest zdefiniowana, np

$var = array(2,5);

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

twój wynik będzie

2
5

w takim przypadku każdy element w tablicy ma możliwy do poznania indeks, ale jeśli zrobisz coś takiego:

$var = array_push($var,10);

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

nie masz wyjścia. Dzieje się tak, ponieważ tablice w PHP nie są strukturami liniowymi, tak jak w większości języków. Bardziej przypominają tabele skrótów, które mogą mieć klucze do wszystkich przechowywanych wartości lub nie. Dlatego foreach nie używa indeksów do indeksowania nad nimi, ponieważ mają indeks tylko wtedy, gdy tablica jest zdefiniowana. Jeśli potrzebujesz indeksu, upewnij się, że tablice są w pełni zdefiniowane, zanim zaczniesz się nad nimi przeszukiwać, i użyj pętli for.


Tak, dlatego w PHP musimy „łączyć tablice” kluczami, a nie indeksami ... Zobacz także array_map (func, $ a, $ b).
Peter Krauss

Ops, drogi czytelniku i @TheBrawnyMan, pamiętaj również, że twój przykład jest jak błąd array_push () (!). Zalecane jest użycie $var[] = 10;(patrz łącze PHP do przewodnika), aby druga forpętla generowała oczekiwane wyniki.
Peter Krauss

4

Macierze PHP mają wewnętrzne wskaźniki, więc spróbuj tego:

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

Działa dobrze dla mnie (tylko bardzo wstępnie przetestowane).


1

Zwykle robię to podczas pracy z tablicami asocjacyjnymi:

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

Działa to również dobrze z tablicami niepowiązanymi. $ key będzie wartością indeksu. Jeśli wolisz, możesz to zrobić:

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

4
Po co jest „alternatywa”? Wiesz, że to samo, oprócz nazw zmiennych? Ostatnie zdanie i blok kodu są niepotrzebne, powiedziałbym - jeśli coś zrobi, to po prostu myli ..
Dennis98 28.10.16

@ Dennis98 Różnica polega na tym, że jedna z nich ma tablicę asocjacyjną jako wejściową, a druga tablicę numeryczną. Chociaż myślę, że byłoby lepiej, gdyby odpowiedź była nieco bardziej szczegółowa.
I_ATE_YOUR_WORK_FILES

0

Chciałbym to dodać, użyłem tego w laravel, aby po prostu zindeksować moją tabelę:

  • Z $ loop-> indeksem
  • Wstępnie zwiększam ją za pomocą pętli ++ $, aby zacząć od 1

Mój kod:

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

To pytanie nie zostało zadane dla laravel. $loopZmienna nie może być używany, ponieważ jest proszony o ogólnym PHP.
Özgür Can Karagöz

0

Rozwiązałem w ten sposób, gdy musiałem użyć indeksu foreach i wartości w tym samym kontekście:

$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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.