Цикл foreach — це оператор для обходу елементів у колекції. Foreach можна використовувати замість оператора циклу for. Однак, на відміну від циклу for, у циклах foreach зазвичай немає явного лічильника: він виконує зазначені в тілі дії для кожного елемента в колекції, а не заздалегідь визначену кількість разів. В об'єктно-орієнтованих мовах ітератор, навіть якщо він неявний, часто використовується як засіб обходу. Синтаксис оператора foreach може відрізнятися, залежно від мови програмування. Загалом він такий:для кожного елемента колекції: набір дій, які для поточного елемента треба виконати Мови програмування, котрі підтримують оператор foreach: ABC, ActionScript, Ada, C++11, C#, ColdFusion Markup Language (CFML), Cobra, D, , Delphi, ECMAScript, Erlang, Java (від версії 1.5), JavaScript, Lua, Objective-C (від версії 2.0), ParaSail, Perl, PHP, Prolog, Python, REALbasic, Rebol, Red, Ruby, Scala, Smalltalk, Swift, Tcl, tcsh, оболонки Unix, Visual Basic.NET і Windows PowerShell.
Цикл foreach у різних мовах
ActionScript 3.0
ActionScript підтримує стандарт ECMAScript 4.0 для for each .. in, котрий підставляє кожне зі значень замість value.var foo:Object = { "apple":1, "orange":2
for each (var value:int in foo) { trace(value); }
// returns "1" then "2" ActionScript підтримує також for .. in, котрий підставляє кожен із ключів замість key.for (var key:String in foo) { trace(key); }
// повертає спочатку "apple", потім "orange"
Ada
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 Мова 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# У C#, припускаючи, що myArray є масивом цілих чисел:foreach (int x in myArray) { Console.WriteLine(x); }
C++ C++11 підтримує цикл foreach. Синтаксис схожий до мови Java:#include <iostream>
int main() { int myint[] = {1, 2, 3, 4, 5};
for (int i : myint)
std::cout << i << '\n';
Java У Java конструкція foreach з'явилася в Java Development Kit (JDK) 1.5.0"Enhanced for Loop - This new language construct[...]".
Офіційні джерела використовують для конструкції кілька назв. Її називають «розширеним циклом for» (), «циклом For-Each»"The For-Each Loop" і «оператором foreach»"Implementing this interface allows an object to be the target of the "foreach" statement.". for (Type item : iterableCollection) { // Do something to item }
JavaScript Стандарт ECMAScript 6 має for..of для безіндексної ітерації по генераторах, масивах тощо:for (var item of array){ // Do stuff } Альтернативний функціональний стиль: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 У мові програмування 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]
Примітки