【VB.NETプログラマーから見たPHP】foreachについて

PHP

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) }

$arrの要素を$valueに設定し、2倍した値を$valueに設定していますが、$valueの値は$arrの要素を値渡ししているので変更されません。

  • ループの中で配列の要素を直接変更したい場合は、 $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) }

変数を参照渡しにする事で、$arrの値を算出した結果にする事が出来ます。


変数を参照渡しにする時の注意点

  • 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) }

2回目のforeachで値渡しを行っているが、1回目のforeachで&$valueをunsetしていない、その為、参照が切れていない状態となっているので参照元の値が書き換わっている。

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) }

変数を利用した後に、「unset($value);」にて解除を行う事で想定の動作になります。

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) }

$arrに配列で「1,2,3,4」を設定した場合、Keyとなる値は0からの数値となります。

連想配列

<?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) }

$keyに文字が設定されており、$arrの値に$keyの値でアクセスする事ができる。

まとめ

  • ループの中で配列の要素を直接変更したい場合は、 $value の前に & をつける
  • foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなるのでunset() でその参照を解除しておく必要がある
  • 反復で現在の要素のキーを変数 $keyに代入する
  • =>はダブルアロー演算子で「配列と連想配列」がある

コメント

タイトルとURLをコピーしました