Цикл foreach — це оператор для обходу елементів у колекції. Foreach можна використовувати замість оператора циклу for. Однак, на відміну від циклу for, у циклах foreach зазвичай немає явного лічильника[1]: він виконує зазначені в тілі дії для кожного елемента в колекції, а не заздалегідь визначену кількість разів. В об'єктно-орієнтованих мовах ітератор, навіть якщо він неявний, часто використовується як засіб обходу.

Для перебору елементів у колекції майже завжди використовують цикли Foreach

Синтаксис оператора foreach може відрізнятися, залежно від мови програмування. Загалом він такий:

для кожного елемента колекції:
    набір дій, які для поточнного елемента треба виконати

Мови програмування, котрі підтримують оператор foreach: ABC, ActionScript, Ada, C++11, C#, ColdFusion Markup Language (CFML), Cobra, D, Daplex[en], Delphi, ECMAScript, Erlang, Java (від версії 1.5), JavaScript, Lua, Objective-C (від версії 2.0), ParaSail, Perl, PHP, Prolog[2], Python, REALbasic, Rebol[3], Red[4], Ruby, Scala, Smalltalk, Swift, Tcl, tcsh, оболонки Unix, Visual Basic .NET і Windows PowerShell.

Цикл foreach у різних мовах

ред.

ActionScript 3.0

ред.

ActionScript підтримує стандарт ECMAScript 4.0[5] для for each .. in[6], котрий підставляє кожне зі значень замість value.

var foo:Object = {
	"apple":1,
	"orange":2
};

for each (var value:int in foo) { 
	trace(value); 
}

// returns "1" then "2"

ActionScript підтримує також for .. in[7], котрий підставляє кожен із ключів замість key.

for (var key:String in foo) { 
	trace(key); 
}

// повертає спочатку "apple" , потім "orange"

Ada підтримує конструкцію foreach як частину циклу for. Нехай, X — це масив:

for I in X'Range loop
   X (I) := Get_Next_Element;
end loop;

Цей синтаксис використовується переважно для масивів, але також буде працювати з іншими типами, коли потрібен повний обхід.

Ada 2012 має узагальнені цикли для повного обходу контейнерів будь-якого типу (масив, списки, карти…):

for Obj of X loop
   -- Work on Obj
end loop;

Мова C не має колекцій або конструкції foreach. Однак вона має кілька стандартних структур даних, які можна використовувати як колекції, а foreach можна легко створити за допомогою макроса.

Однак виникають дві очевидні проблеми:

  • Макрос оголошує нову змінну в існуючій області видимості, яка залишається після циклу.
  • Не можна визначити один макрос foreach, який працює з різними типами колекцій (наприклад, масив і зв'язаний список) або який можна розширити для типів користувачів.

Приклад коду на С, що працює як foreach:

#include <stdio.h>

/* foreach macro viewing a string as a collection of char values */
#define foreach(ptrvar, strvar) \
char* ptrvar; \
for (ptrvar = strvar; (*ptrvar) != '\0'; *ptrvar++)

int main(int argc, char** argv) {
 char* s1 = "abcdefg";
 char* s2 = "123456789";
 foreach (p1, s1) {
  printf("loop 1: %c\n", *p1);
 }
 foreach (p2, s2) {
  printf("loop 2: %c\n", *p2);
 }
 return 0;
}

У C#, припускаючи, що myArray є масивом цілих чисел:

foreach (int x in myArray) { Console.WriteLine(x); }

C++11 підтримує цикл foreach. Синтаксис схожий до мови Java:

#include <iostream>

int main()
{
  int myint[] = {1, 2, 3, 4, 5};

  for (int i : myint)
  {
    std::cout << i << '\n';
  }
}

У Java конструкція foreach з'явилася в Java Development Kit (JDK) 1.5.0[8] .

Офіційні джерела використовують для конструкції кілька назв. Її називають «розширеним циклом for» (англ. Enhanced for Loop)[8], «циклом For-Each»[9] і «оператором foreach»[10].

for (Type item : iterableCollection) {
    // Do something to item
}

JavaScript

ред.

Стандарт ECMAScript 6 має for..of для безіндексної ітерації по генераторах, масивах тощо:

for (var item of array){
    // Do stuff
}

Альтернативний функціональний стиль[11]:

array.forEach(item => {
    // Do stuff
})

Для невпорядкованої ітерації за ключами в об'єкті JavaScript має цикл for...in:

for (var key in object) {
    // Do stuff with object[key]
}

Щоб обмежити ітерацію власними властивостями об'єкта, за винятком тих, які успадковуються через ланцюжок прототипів, іноді корисно додати тест hasOwnProperty(), якщо його підтримує рушій JavaScript.

for (var key in object) {
    if (object.hasOwnProperty(key)) {
        // Do stuff with object[key]
    }
}

У мові програмування PHP конструкція foreach надає простий спосіб перебору масивів. foreach працює тільки з масивами та об'єктами, і генеруватиме помилку за спроби використання зі змінними інших типів або неініціалізованими змінними. Існує два види синтаксису:

1. З використанням лише значення:

foreach ($set as $value) {
    // Do something to $value;
}

2. З використанням ключа та значення:

foreach ($set as $key => $value) {
    echo "{$key} has a value of {$value}";
}

Python

ред.
for item in iterable_collection:
    # Do something with item

Присвоєння кортежу Python, повністю доступне в його циклі foreach, також робить тривіальним перебір пар (ключ, значення) в асоціативних масивах[джерело?]:

for key, value in some_dict.items():  # Direct iteration on a dict iterates on its keys
    # Do stuff

Через те, що for ... in є єдиним різновидом циклу for у Python, еквівалентом циклу з параметром є

for i in range(len(seq)):
    # Do something to seq[i]

Коректнішим для Python вважають використання функції enumerate:

for i, item in enumerate(seq):
    # Do stuff with item
    # Possibly assign it back to seq[i]

Примітки

ред.
  1. D Programming Language foreach Statement Documentation. Digital Mars. Процитовано 4 серпня 2008.
  2. SWI-Prolog -- foreach/2. www.swi-prolog.org. Процитовано 10 лютого 2020.
  3. http://www.rebol.com. {{cite web}}: Пропущений або порожній |title= (довідка)
  4. http://www.red-lang.org. {{cite web}}: Пропущений або порожній |title= (довідка)
  5. Proposed ECMAScript 4th Edition – Language Overview (PDF). Процитовано 21 лютого 2020.
  6. for each..in. Процитовано 21 лютого 2020.
  7. for..in. Процитовано 21 лютого 2020.
  8. а б "Enhanced for Loop - This new language construct[...]" Java Programming Language, Section: Enhancements in JDK 5. Sun Microsystems, Inc. 2004. Процитовано 26 травня 2009.
  9. "The For-Each Loop" The For-Each Loop. Sun Microsystems, Inc. 2008. Процитовано 10 травня 2009.
  10. "Implementing this interface allows an object to be the target of the "foreach" statement." Iterable (Java Platform SE 6). Sun Microsystems, Inc. 2004. Процитовано 12 травня 2009.
  11. Array.prototype.forEach() - JavaScript | MDN.