Pętla foreach, pętla „po kolekcji” – w programowaniu rodzaj pętli, której wykonanie polega na powtarzaniu kolejnych iteracji dla wszystkich elementów (komórek) wybranego agregatu danych, takiego jak, np. tablica, lista, kolekcja, kolejka lub innego, dostępnego w danym języku programowania, bądź jego konkretnej implementacji. Pętla taka automatycznie przed przejściem do wykonania kolejnej iteracji przypisuje zadanej w nagłówku pętli zmiennej sterującej wartość kolejnego elementu (komórki).

Składnia Składnia zapisu tego rodzaju pętli jest różna w poszczególnych językach programowania, lecz można wyodrębnić pewne ogólne, charakterystyczne zasady: na początku definicji pętli zwykle występuje słowo kluczowe identyfikujące pętlę; są to słowa for each (np. Visual Basic, VBA), lub pisane łącznie jedno słowo foreach (np. D, PHP); rzadziej słowo for i słowo foreach stanowią synonim i mogą być używane zamiennie, zarówno w pętli ogólnej, jak i w pętli "po kolekcji" (np. Perl), lub inne następnie specyfikowana jest zmienna sterująca za nią często spotkać można słowo łączące, np. in dalej definiowany jest agregat danych, dla którego ma być wykonywana pętla, ewentualnie w niektórych językach występuje kolejne słowo łączące, zamykające definicję pętli, np. do. Natomiast składnia tej pętli, w tych językach, w których występuje pętla ogólna, często wzorowana jest na składni tej pętli. W tym przypadku zamiast słów łączących stosuje się nawiasy i średniki.

Działanie Działanie tej pętli polega na wykonaniu następujących kroków: ustal jako bieżący, pierwszy element kontenera danych, jeżeli kontener jest pusty, zakończ działanie pętli przypisz wartość bieżącego elementu do zmiennej sterującej wykonaj iterację sprawdź czy istnieje kolejny ("następny") element w kontenerze: jeżeli istnieje, to ustal jako bieżący ten kolejny element kontenera i przejdź do punktu 2 jeżeli nie istnieje to zakończ wykonywanie pętli.

Pętla foreach w językach programowania Pętla tego typu dostępna jest w nowszych językach, w szczególności w językach zorientowanych na programowanie obiektowe, w których zrealizowano dynamiczne struktury danych. Również w kolejnych implementacjach języków, w których nie było tego rodzaju pętli, wprowadza się ją, szczególnie wraz z wprowadzaniem nowych kontenerów danych dostępnych standardowo w nowych implementacjach.

+ Pętla foreach w językach programowania język programowania składnia Adafor zmienna-sterująca in [reverse] kontener-typ-lub-zakres [range zakres] loop -- instrukcje end loop; Dforeach(zmienna-sterująca; kontener) /* instrukcja */; JavaScriptfor (zmienna-sterująca in kontener) /* instrukcja */;Luafor indeks, zmienna-sterująca in pairs(kontener) do -- instrukcje end Perlforeach zmienna-sterująca (kontener) { # instrukcje } for zmienna-sterująca (kontener) { # instrukcje } PHPforeach(kontener as zmienna-sterująca) { /* instrukcje */ } Pythonfor zmienna-sterująca in kontener: # instrukcje Visual Basic, VBAFor Each zmienna-sterująca In kontener ' instrukcje Next zmienna-sterująca Uwaga: nawiasy kwadratowe obejmują frazy opcjonalne

Porównanie z innymi konstrukcjami Pętlę foreach można zaimplementować za pomocą innych konstrukcji dostępnych w danym języku programowania. Pętla ta została wprowadzona do języków programowania lub ich kolejnych, nowszych implementacji jako rozwinięcie wcześniej stosowanych pętli, jako konstrukcja działająca na wyższym poziomie abstrakcji, która czytelniej dla programisty oddaje sens wykonywanych operacji oraz uwalnia go od konieczności jawnego kodowania mało istotnych szczegółów realizacyjnych. Zapis tej pętli jest zapisem samo dokumentującego się kodu źródłowego programu.

Realizacja pętli foreach za pomocą instrukcji warunkowej i skoku Za pomocą instrukcji warunkowej i skoku można zrealizować każdą pętlę, także pętlę "po kolekcji". Widoczna jest jednak nieczytelność takiego kodu w porównaniu do pętli foreach, realizującej zadanie na znacznie wyższym poziomie abstrakcji.

+ Pętla foreach - instrukcja warunkowa i skoku Visual Basic, VBA foreach if, gotoFor Each I In Kontener ' instrukcje Next IIx=1 LenK=Kontener.Len start: If Ix>LenK then Goto koniec I=Kontener.Item(Ix) ' instrukcje Ix=Ix+1 Goto start koniec:

Realizacja pętli foreach za pomocą pętli repetycyjnej Pętla repetycyjna w porównaniu z instrukcją warunkową i skoku pozwana nieco czytelniej zrealizować zadnie pętli foreach, lecz nadal trzeba kodować wiele dodatkowych czynności, realizowanych w pętli "po kolekcji" niejawnie.

+ Pętla foreach - instrukcja repetycyjna Visual Basic, VBA foreach repetycyjnaFor Each I In Kontener ' instrukcje Next IIx=1 LenK=Kontener.Len Do While Ix<=LenK I=Kontener.Item(Ix) ' instrukcje Ix=Ix+1 Loop

Realizacja pętli foreach za pomocą pętli iteracyjnej Realizacja pętli foreach za pomocą pętli iteracyjnej jest łatwa i przejrzysta, pod warunkiem, że istnieje mechanizm badania liczby elementów kontenera danych, niezbędny od ustalenia liczby powtórzeń, lub badania wartości granicznych (granicy dolnej i górnej) indeksów elementów kontenera danych. Szczególną analogię można dostrzec pomiędzy instrukcją foreach a instrukcją iteracyjnych w tych językach programowania, w których instrukcja iteracyjna ma składnię taką jak foreach, tzn. w których określamy, że zmienna sterująca ma przyjmować kolejne wartości podanego zakresu, tak jak to ma miejsce np. w języku Ada (for i in w1..w2 loop ... end loop;). Pętla ta ma możliwość zresztą wykonywania iteracji np. dla wszystkich wartość określonego typu danych lub dla wszystkich komórek tablicy: for i in typ_danych-lub-tablica loop ... end loop;, także dla zakresu: for i in typ_danych range w1..w2 loop ... end loop;, for i in tablica'range(x) loop ... end loop;, oraz w odwrotnej kolejności (modyfikator reverse): for i in reverse typ_danych-lub-tablica loop ... end loop;; co w dużym stopniu klasyfikuje tę pętlę jako pętlę zarówno iteracyjną jak i przede wszystkim "po kolekcji".

+ Pętla foreach - instrukcja iteracyjna Visual Basic, VBA Ada foreach iteracyjna foreach iteracyjnaFor Each I In Kontener ' instrukcje Next ILenK=Kontener.Len For Ix=1 To LenK I=Kontener.Item(Ix) ' instrukcje Next Ixfor I in Kontener loop -- instrukcje end loopws:=Kontener'First wp:=Kontener'Last for Ix in ws..wp loop I=Kontener(Ix) -- instrukcje end loop

Realizacja pętli foreach za pomocą pętli ogólnej Również pętla ogólna umożliwia implementację pętli foreach na zasadach takich jak dla pętli iteracyjnej (iterowanie po kolejnych indeksach kontenera danych), i repetycyjnej (jawny zapis warunku pętli).

+ Pętla foreach - instrukcja ogólna D foreach ogólnaforeach(I; Kontener) { /* instrukcje */ }for(Ix=0; Ix<Kontener.length; Ix++) { I=Kontener[Ix]; /* instrukcje */

Uwagi

Przypisy Podręcznik Visual Basic na Wikibooks

Podręcznik języka D na Wikibooks Podręcznik języka PHP na Wikibooks Podręcznik języka Perl na Wikibooks

Podręcznik języka Python na Wikibooks

Kategoria:Konstrukcje programistyczne