Foreach文

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索

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

目次

[編集] 処理の流れ

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

foreach 変数 (リスト) {}

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

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

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

for ( my $i = 0; $i < @list; $i++ ) {
    変数 = $list[$i];}

ただし、ハッシュテーブル連想配列)については要素の順序関係が決定できないこともあるため、一般に参照順序は不定である。

[編集] 文法

[編集] awk

awkにおいても連想配列の処理を可能にしている。

for(変数 in 配列)
{
  文
}

[編集] C#

foreach (変数 in 配列)
{
  文
}

配列のほか、IEnumeratorもしくはIEnumerator<T>を実装したオブジェクトでもよい。

[編集] C++

C/C++においては言語仕様としてのForeach文は用意されていないが、C++標準ライブラリにfor_eachアルゴリズム(関数テンプレート)が含まれている。

関数オブジェクト = std::for_each(
  先頭イテレータ,
  末尾イテレータ,
  関数オブジェクト
);

なお、C++の次期拡張(C++11)にて、範囲ベースの for ループが言語仕様として追加されている。

for (変数 : 配列)
{}

また、C++/CLI言語およびMicrosoft Visual C++ 2005以降の独自拡張機能では、for each文を使用できる。ただしこれはC++11における範囲ベース for ループとは互換性を持たない。 C++11では、C#同様に型推論およびラムダ式を組み合わせることで、上記の構文が威力を発揮するようになる。

[編集] D

式を評価し、その結果は静的配列、動的配列、連想配列、構造体、クラスでなければいけない。式部分が配列である場合は変数は複数宣言する事が出来る。

foreach(変数 ; 式) {
  文
}

[編集] Java 5.0以降

拡張For文などと呼び、Java 5.0 で導入された。For文の特殊なものとして捉えられるが、Foreach文に相当する。

for(変数 : リスト等) {
  文
}

[編集] JavaScript, ActionScript

オブジェクトの反復処理にはfor-in文を用いる。変数にはプロパティ名(連想配列で言うキー)が代入されるので、プロパティの値は式 オブジェクト[変数] で取得する。

for ( var 変数 in オブジェクト ) {}

JavaScriptのfor-in文は、ユーザー定義のプロパティについて、プロトタイプチェーンをさかのぼって反復処理を行う。このため、特に配列に対してfor-in文を用いると、他の言語とは異なる挙動をすることがある。

var array = new Array(3);
var output = "";
for (var key in array) { output += key + " "; }
// このとき array.length === 3 であるが、
// array にユーザー側からプロパティ(配列要素)を定義していないので、
// output === "" である。
 
// 配列もオブジェクトなので、数値以外のプロパティを設定できる。
array.foo = "foo"
 
output = "";
for (var key in array) { output += key + " "; }
// このとき output === "foo " である。
 
// オブジェクトに新しいインスタンスメソッドを追加してみる。
Object.prototype.myMethod = function () {};
 
output = "";
for (var key in array) { output += key + " "; }
// 配列もオブジェクトなので、このとき output === "foo myMethod " である。
 
// なおもちろん、この時点でも array.length === 3 である。

ECMA-262第5版 (JavaScript 1.6, ActionScript 3.0) からは、ArrayインスタンスにforEachメソッドが追加された。

array.forEach(function (変数) {});

ECMA-262第5版からは、オブジェクトの値で反復処理をするfor each-in文も導入された(スペースで分けられていることに注意)。

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 変数

[編集] Windows PowerShell

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

[編集] 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;

[編集] 関連項目

個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語