PHP マニュアル
前のページ | 第 16章制御構造 | 次のページ

# foreach

PHP 4には、Perlや他の言語とよく似た foreach構文があります。これにより 配列要素に関する反復処理が容易になります。この構造には、 2種類の構文があります。2番目の構文はあまり知られていませんが、 最初の構文の便利な拡張になっています。

    foreach(array_expression as $value)
     文
    foreach(array_expression as $key => $value)
     文

最初の形式は、array_expressionで指定した配列に 関してループ処理を行います。各ループにおいて現在の要素の値が $valueに代入され、内部配列ポインタが一つ前に 進められます。(よって、次のループでは次の要素を見ることになります。)

2番目の形式も同様ですが、各ループで現在の要素のキーが変数 $keyに代入されるところが異なります。

PHP 5 では、 オブジェクトのイタレーション を用いることもできます。

> 注意: foreachの実行開始時に内部配列ポインタは、 配列の先頭要素を指すように自動的にリセットされます。 このため、foreachループの前に reset()をコールする必要はありません。

> 注意: 配列が リファレンス でない限り、foreachは、指定した配列自体に対してではなく、 そのコピーに対して処理を行います。このため、 each() 文のように配列のポインタ位置が変更され ることはなく、返される配列要素への変更は、元の配列には反映されません。 しかし、元の配列の内部ポインタは、配列の処理に伴い前に進められます。 foreachループが完了した時点で、 配列の内部ポインタは、配列の最後を指すことになります。

> PHP 5以降、$value の前に &を付けることで、 容易に配列の要素の値を変更できるようになっています。 これにより、値をコピーするのではなく、 リファレンスが 代入されます。

> `<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr は array(2, 4, 6, 8)となる ?>`

> この機能は、ループ処理される配列が参照可能である場合(すなわち、 変数である)のみ使用可能です。

> 注意: foreach は、'@' によりエラーメッセージ出力を抑 制する機能をサポートしていません。

既にご存知かと思いますが、以下の文は機能的に等価です。

`<?php $arr = array("one", "two", "three"); reset($arr); while (list(, $value) = each($arr)) { echo "Value: $value<br />\n"; } foreach ($arr as $value) { echo "Value: $value<br />\n"; } ?>`

以下の文も機能的に等価です。

`reset ($arr); while (list($key, $value) = each ($arr)) { echo "Key: $key; Value: $value<br />\n"; } foreach ($arr as $key => $value) { echo "Key: $key; Value: $value<br />\n"; }`

使用法を示すためにその他の例を示します。

`/* foreach の例 1: 値のみ */ $a = array (1, 2, 3, 17); foreach ($a as $v) { echo "Current value of \$a: $v.\n"; } /* foreachの例2: 値 (説明用にキーを出力) */ $a = array (1, 2, 3, 17); $i = 0; /* 説明用 */ foreach($a as $v) { echo "\$a[$i] => $v.\n"; $i++; } /* foreachの例3: キーと値 */ $a = array( "one" => 1, "two" => 2, "three" => 3, "seventeen" => 17 ); foreach($a as $k => $v) { echo "\$a[$k] => $v.\n"; } /* foreach の例4: 多次元配列 */ $a = array(); $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach($a as $v1) { foreach ($v1 as $v2) { echo "$v2\n"; } } /* foreach の例5: 動的配列 */ foreach(array(1, 2, 3, 4, 5) as $v) { echo "$v\n"; }`

前のページ | ホーム | 次のページ
for | 上に戻る | break