foreach は、配列を反復処理するための便利な方法、foreach が使えるのは配列とオブジェクトだけです。
VB.NETを使っているプログラマー観点で、解り難い点をピックアップして解説します。
PHPプログラムを組む上で注意する点のあるので、ぜひ最後までお読みください。
構造には二種類の構文がある
foreach (iterable_expression as $value)
- iterable_expression で指定した反復可能な値に 関してループ処理を行う
- 反復において現在の要素の値が $valueに代入される
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as $value) {
$value = $value * 2;
echo $value."\n";
}
var_dump($arr);
?>
2
4
6
8
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
- ループの中で配列の要素を直接変更したい場合は、 $value の前に & をつける
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
echo $value."\n";
}
var_dump($arr);
?>
2
4
6
8
array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> &int(8) }
変数を参照渡しにする時の注意点
- foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなる
- unset() でその参照を解除しておく必要がある
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
echo $value."\n";
}
echo "---\n";
foreach ($arr as $value) {
$value = $value * 2;
echo $value."\n";
}
var_dump($arr);
?>
2
4
6
8
—
4
8
12
24
array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> &int(24) }
VB.NETプログラマーが想定結果にするには「unset()」にて利用する変数の割当を解除する必要があります。
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
echo $value."\n";
}
unset($value);
echo "---\n";
foreach ($arr as $value) {
$value = $value * 2;
echo $value."\n";
}
var_dump($arr);
?>
2
4
6
8
—
4
8
12
16
array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) }
foreach (iterable_expression as $key => $value)
配列
<?php
$arr = array(1, 2, 3, 4);
foreach($arr as $key=> $value){
echo "{$key} => {$value} "."\n";
}
var_dump($arr);
?>
0 => 1
1 => 2
2 => 3
3 => 4
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
連想配列
<?php
$arr = array("a"=>1,"b"=> 2,"c"=> 3,"d"=> 4);
foreach($arr as $key=> $value){
echo "{$key} => {$value} "."\n";
}
echo "直接アクセス:{$key} => {$arr[$key]} "."\n";
var_dump($arr);
?>
a => 1
b => 2
c => 3
d => 4
直接アクセス:d => 4
array(4) { [“a”]=> int(1) [“b”]=> int(2) [“c”]=> int(3) [“d”]=> int(4) }
まとめ
- ループの中で配列の要素を直接変更したい場合は、 $value の前に & をつける
- foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなるのでunset() でその参照を解除しておく必要がある
- 反復で現在の要素のキーを変数 $keyに代入する
- =>はダブルアロー演算子で「配列と連想配列」がある
コメント