PHPで配列の要素をひとつずつ取り出して繰り返し処理する構文、foreach文の解説をします。
foreach文の使い方
foreach文は、配列の要素をひとつずつ取り出して順番に処理していきます。すべての要素を処理したら、ループは終了します。
for文やwhile文のように、ループを終了する条件を記述する必要がないので、配列を扱うならばforeach文を使うのが便利です。
あと、配列だけではなく、オブジェクトも同じように扱うことができます。
配列から値を取り出す
foreach文の書き方は次のとおりです。
foreach (配列 as 値を入れる変数){
処理
}
具体的に書くとこうなります。
$members = array(
'カイザー・ヴァッテンバハ',
'マルテ・ゾンバルト',
'ヴェンデル・ギーレン',
'アレクシス・ゲーアマン',
'ジーモン・テーリヒェン'
);
foreach ($members as $value) {
echo $value . '<br>';
}
カイザー・ヴァッテンバハ
マルテ・ゾンバルト
ヴェンデル・ギーレン
アレクシス・ゲーアマン
ジーモン・テーリヒェン
- ループの1周目では配列
$members
の1つ目の要素の値が$value
に代入され処理されます。 - 2周目では2つ目の要素が
$value
に代入され処理されます。 - 以降同じことを繰り返し、5週目ですべての要素を取り出したので、ループが終了します。
連想配列からキーと値を取り出す
連想配列を扱う場合は、キーと値をそれぞれ取り出すことができます。
foreach (配列 as キーを入れる変数 => 値を入れる変数){
処理
}
具体的に書きます。
$member = array(
'名前' => 'カイザー・ヴァッテンバハ',
'年齢' => '26',
'職業' => 'ホワホワ竹笛奏者'
);
foreach ($member as $key => $value) {
echo '[' . $key . '] ' . $value . '<br>';
}
[名前] カイザー・ヴァッテンバハ
[年齢] 26
[職業] ホワホワ竹笛奏者
キーと値を入れる変数名
キーと値を入れる変数名は、ここでは$key
, $value
としていますが、どんな変数名でもOKです。
ただひとつ注意してほしいのは、ループを抜けた後でもこれらの変数には値が代入されたままになるということです。
$member = array(
'名前' => 'カイザー・ヴァッテンバハ',
'年齢' => '26',
'職業' => 'ホワホワ竹笛奏者'
);
foreach ($member as $key => $value) {
echo '[' . $key . '] ' . $value . '<br>';
}
echo $value;
[名前] カイザー・ヴァッテンバハ
[年齢] 26
[特技] ホワホワ竹笛奏者
ホワホワ竹笛奏者
foreach文の中で使う変数は、他で使われている変数名と被らないようにしておいたほうが安全でしょう。
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
breakとcontinue
foreach文で、繰り返し処理を中断したりスキップするにはbreak
とcontinue
を使います。
break
繰り返しの途中で処理を中断するにはbreak
を使います。
$members = array(
'カイザー・ヴァッテンバハ',
'マルテ・ゾンバルト',
'ヴェンデル・ギーレン',
'アレクシス・ゲーアマン',
'ジーモン・テーリヒェン'
);
foreach ($members as $value) {
if ($value == 'アレクシス・ゲーアマン') {
break;
}
echo $value . '<br>';
}
カイザー・ヴァッテンバハ
マルテ・ゾンバルト
ヴェンデル・ギーレン
$value
がアレクシス・ゲーアマン
になったときに処理が中断され、それ以降のループは実行されません。
continue
繰り返しの途中で処理をスキップするにはcontinue
を使います。
$member = array(
'名前' => 'カイザー・ヴァッテンバハ',
'年齢' => '26',
'職業' => 'ホワホワ竹笛奏者'
);
foreach ($member as $key => $value) {
if ($key == '年齢') {
continue;
}
echo '[' . $key . '] ' . $value . '<br>';
}
[名前] カイザー・ヴァッテンバハ
[職業] ホワホワ竹笛奏者
$key
が年齢
のときだけ処理が実行されず、それ以降はまた繰り返し処理が再開されます。
配列の値を書き換えたい
下記は配列$numbers
に入っている値を10倍にするコードです。しかし、うまくいきません。
$numbers = array(1, 2, 3, 4, 5);
foreach ($numbers as $value) {
$value *= 10;
}
print_r($numbers);
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
なぜ$numbers
には10倍された値が入らなかったのでしょうか。
それはforeach文において、$value
には$numbers
の要素のコピーが代入されるからです。コピーを10倍しても、元の配列$numbers
の要素は書き換えられません。このように変数に他の変数の値のコピーを渡すことを「値渡し」といいます。
では、どうすれば配列$numbers
の値を書き換えることができるのでしょうか。
$numbers = array(1, 2, 3, 4, 5);
foreach ($numbers as &$value) {
$value *= 10;
}
print_r($numbers);
Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 )
今度はうまくいきました。
$value
の前に&
をつけると、$numbers
の要素は$value
に「参照渡し」されます。参照渡しとは$value
が$numbers[*]
のエイリアス(別名)になるようなものだと思ってください。そうすると、$value
を書き換えれば$numbers[*]
も書き換わるというわけです。
他の方法もあります。
$numbers = array(1, 2, 3, 4, 5);
foreach ($numbers as $key => $value) {
$numbers[$key] = $value * 10;
}
print_r($numbers);
Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 )
$numbers[*]
に直接値を代入していく方法です。
参照渡しを使う方法と比べるとスマートさを欠きますが、私はこちらのほうが好きです。参照渡しってなんか難しいもんね。
foreach文を使わなくてもできること
配列の値の合計を計算してみます。
$numbers = array(1, 2, 3, 4, 5);
$sum = NULL;
foreach ($numbers as $value) {
$sum += $value;
}
echo $sum;
15
はい、うまくいきました。
じゃあ、このやり方でいいのかといえば、別の方法もあるわけです。
$numbers = array(1, 2, 3, 4, 5);
$sum = array_sum($numbers);
echo $sum;
15
array_sum
関数を使ってみました。こっちのほうがオシャレですよね。
このように、PHPには配列を扱うための便利な関数がたくさん用意されています。
馬鹿の一つ覚えで何でもforeachでやるのではなく、このような関数も使っていきましょう。
でわでわ
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
コメント