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?

użytkownik18334
źródło

Odpowiedzi:

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

$keyjest indeksem każdego $arrayelementu

piekarnik
źródło
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++;
}
ConroyP
źródło
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.

Bailey Parker
źródło
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
}
Zoredache
źródło
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.

Lalafur Waage
źródło
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;
}
Trev
źródło
17
Nie, jeśli jest to tablica asocjacyjna
JoeCortopassi
8

Myślę, że najlepsza opcja jest taka sama:

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

to jest łatwe i normalne

Mikel Williams
źródło
Działa jak urok
Steve Nosse,
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.

Krzepki mężczyzna
źródło
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).

coś
źródło
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
}
Randy Greencorn
źródło
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
Taranis
źródło
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
Carlos Cavalchuki
źródło
-1
foreach(array_keys($array) as $key) {
//  do stuff
}
gdmanandamohon
źródło