Foreach文

出典: フリー百科事典『ウィキペディア(Wikipedia)』

foreach文(フォーイーチぶん)とはプログラミング言語においてリストハッシュテーブルなどのデータ構造の各要素に対して与えられたの実行を繰り返すというループを記述するための文である。foreach文はしばしばfor文の一部という位置付けにある。for文と異なり要素の参照順序が定義されないこともある。

目次

[編集] 処理の流れ

基本的な構文(Perl)は以下のようになる。

foreach 変数 (リスト等) {
  文
}

このループはだいたい次のような手順で実行される。

  1. 変数にリストの中のある要素への参照を代入する。
  2. 文を実行する。
  3. リストの全要素を参照し終わっていない場合は、変数に未参照の要素を代入して文の実行へ戻る。

ここで、線形リスト配列など要素の順序が決まっているものは、通常その順序でループが実行されるので、この場合以下とほぼ同様である。

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;

[編集] 関連項目

他の言語