Foreach文
出典: フリー百科事典『ウィキペディア(Wikipedia)』
foreach文(フォーイーチぶん)とはプログラミング言語においてリストやハッシュテーブルなどのデータ構造の各要素に対して与えられた文の実行を繰り返すというループを記述するための文である。foreach文はしばしばfor文の一部という位置付けにある。for文と異なり要素の参照順序が定義されないこともある。
目次 |
[編集] 処理の流れ
基本的な構文(Perl)は以下のようになる。
foreach 変数 (リスト等) {
文
}
このループはだいたい次のような手順で実行される。
- 変数にリストの中のある要素への参照を代入する。
- 文を実行する。
- リストの全要素を参照し終わっていない場合は、変数に未参照の要素を代入して文の実行へ戻る。
ここで、線形リストや配列など要素の順序が決まっているものは、通常その順序でループが実行されるので、この場合以下とほぼ同様である。
for($i = 0; $i <= $#list; $i ++) {
変数 = \$list[$i];
文
}
ただし、ハッシュテーブル(連想配列)については要素の順序関係が決定できないこともあるため、一般に参照順序は不定である。
[編集] 文法
[編集] awk
awkにおいても連想配列の処理を可能にしている。
for(変数 in 配列)
{
文
}
[編集] C#
foreach (変数 in IEnumerator)
{
文
}
[編集] C++
C/C++においては言語仕様としてのForeach文は用意されていないが、C++標準ライブラリにfor_eachアルゴリズム(関数)が含まれている。
関数オブジェクト = std::for_each( 先頭イテレータ, 末尾イテレータ, 関数オブジェクト );
なお、C++の次期拡張にて、範囲ベースの for ループが言語仕様として追加される見通しである。
[編集] D
式を評価し、その結果は静的配列、動的配列、連想配列、構造体、クラスでなければいけない。式部分が配列である場合は変数は複数宣言する事が出来る。
foreach(変数 ; 式) {
文
}
[編集] Java 5.0以降
拡張For文などと呼び、Java 5.0 で導入された。For文の特殊なものとして捉えられるが、Foreach文に相当する。
for(変数 : リスト等) {
文
}
[編集] JavaScript, ActionScript
for(変数 in リスト等) {
文
}
変数には要素ではなく、リスト等から要素を取得するためのキーが代入される。
JavaScript 1.6及びActionScript 3.0からは、他の言語と同様のfor each文も導入された(スペースで分けられていることに注意)。
for each (変数 in リスト等) {
文
}
[編集] Perl
しばしばforが代用とされる。Perlにおいて、forとforeachは同義語である。
foreach 変数 (リスト等) {
文
}
[編集] PHP
foreach (配列 as 変数) {
文
}
foreach (配列 as 変数1 => 変数2) {
文
}
前者の場合、処理手順は他の言語と同様だが、後者の場合、変数1に配列の添字が、変数2に要素が代入される。
[編集] Python
PythonにおけるFor文とは、他の言語におけるForeach文と同等である。
for 変数 in リスト等 :
文
[編集] Ruby
for 変数 in リスト等 文 end
これは以下のイテレータ構文と等価である。
リスト等.each do |変数| 文 end
なお、Rubyに関してはもっぱら後者の構文が好まれる傾向にある。
[編集] Visual Basic
For Each 変数 In リスト等 文 Next 変数
[編集] HSP
foreach 変数 文 loop
[編集] なでしこ
(リスト)を反復。 文
変数は「それ」に代入される。
[編集] シェルスクリプト
cshではforeachと書き、shではforと書く。実用上リストの部分にはワイルドカードを含むファイル列を書くことが多い。
csh系
foreach 変数 ( リスト ) 文 end
sh系
for 変数 in リスト do 文 done
[編集] 番外編
[編集] PL/SQL
OracleのPL/SQLにも、カーソルというForEachと似たような機能が実装されている。 カーソルは用途が限定されているため、番外編として紹介する。
SELECT文でとってきた複数レコードを、カーソルを使って順繰り出力するPL/SQL文を示す。
DECLARE
CURSOR C IS
SELECT
*
FROM
TBL1
WHERE
TBL1.FIELD1 >= 100;
BEGIN
FOR D IN C LOOP
DBMS_OUTPUT.PUT_LINE(D.FIELD1 || ' ' || D.FIELD2 || ' ' || D.FIELD3);
END LOOP;
END;

