foreach

(PHP 4, PHP 5, PHP 7, PHP 8)

foreach は、配列を反復処理するための便利な方法です。 foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。 この構造には二種類の構文があります。

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

最初の形式は、iterable_expression で指定した反復可能な値に 関してループ処理を行います。各反復において現在の要素の値が $valueに代入されます。

2番目の形式は、さらに各反復で現在の要素のキーを変数 $keyに代入します。

foreach は、 current()key() のような関数で使われる、内部的な配列のポインタを変更しない点に注意して下さい。

オブジェクトの反復処理をカスタマイズ することもできます。

ループの中で配列の要素を直接変更したい場合は、 $value の前に & をつけます。こうすると、変数には リファレンス が代入されることになります。

<?php
$arr
= array(1, 2, 3, 4);
foreach (
$arr as &$value) {
$value = $value * 2;
}
// $arr は array(2, 4, 6, 8) となります
unset($value); // 最後の要素への参照を解除します
?>

警告

foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなります。 unset() でその参照を解除しておくようにしましょう。 さもないと、次のような目に遭うことになるでしょう。

<?php
$arr
= array(1, 2, 3, 4);
foreach (
$arr as &$value) {
$value = $value * 2;
}
// この時点で、$arr は array(2, 4, 6, 8) となります

// unset($value) しなければ、$value は今でも最後の要素 ($arr[3]) を指したままです

foreach ($arr as $key => $value) {
// $arr[3] が、$arr の各要素で上書きされて...
echo "{$key} => {$value} ";
print_r($arr);
}
// ...つまり、二番目から最後までの値が最後の値にコピーされていきます

// 出力
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

配列定数の値を、参照によって反復処理させることもできます。

<?php
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
?>

注意:

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

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

<?php
/* 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";
}
?>

ネストした配列の list() による展開

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

配列の配列の反復処理を行うこともできます。 値として list() を渡すと、 ネストした配列をループ変数に展開できます。

例を示します。

<?php
$array
= [
[
1, 2],
[
3, 4],
];

foreach (
$array as list($a, $b)) {
// $a にはネストした配列の最初の要素が含まれ、
// $b には二番目の要素が含まれます。
echo "A: $a; B: $b\n";
}
?>

上の例の出力は以下となります。

A: 1; B: 2
A: 3; B: 4

list() で指定する要素数を、ネストした配列の要素数より少なくしてもかまいません。 その場合は、配列の残りの要素は無視されます。

<?php
$array
= [
[
1, 2],
[
3, 4],
];

foreach (
$array as list($a)) {
// $b を指定していないことに注目。
echo "$a\n";
}
?>

上の例の出力は以下となります。

1
3

list() で指定した変数を埋めるだけの要素が足りないときには、notice が発生します。

<?php
$array
= [
[
1, 2],
[
3, 4],
];

foreach (
$array as list($a, $b, $c)) {
echo
"A: $a; B: $b; C: $c\n";
}
?>

上の例の出力は以下となります。


Notice: Undefined offset: 2 in example.php on line 7
A: 1; B: 2; C: 

Notice: Undefined offset: 2 in example.php on line 7
A: 3; B: 4; C: 

add a note

User Contributed Notes 3 notes

up
21
Okafor Chiagozie
11 months ago
An easier way to unpack nested array elements

$array = [
[1, 2],
[3, 4],
];

foreach ($array as [$a, $b]) {
echo "A: $a; B: $b\n";
}
up
1
Sanusi Hassan
1 year ago
destructure array elements

you can unpac nested array elements using the following

<?php
$array
= [
[
1, 2],
[
3, 4],
];

foreach (
$array as $v) {
[
$a, $b] = $v;
echo
"A: $a; B: $b\n";
}
?>
up
-53
jon at pearkins dot com
11 months ago
For an array, foreach presents the elements of the array in the order that they were added to the array. For example, if you need to have the elements presented in ascending order by key, use the ksort function to rearrange the elements of the array in key sequence.

This behavior is a result of the way that PHP arrays are stored. foreach merely presents the elements of an array in the order that they are stored within the array.
To Top