くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

PHPの配列で&を使うとポインタ的な使い方が出来る?【参照渡し】

foreach分で配列の中身を書き換えようとしたら全く書き変わらなくて困ったのでメモ

$ score = array(70,80,90);

foreach($score as $value){

  $value = $value * 0.9;

}

var_dump($score);

この結果がarray(3) { [0]=> int(70) [1]=> int(80) [2]=> int(90) }

値が最初のままで0.9倍されていないですね。

調べてみると、foreach()の仕様で ”foreach文で要素の値を変数に格納すると、値のコピーが変数に代入されます。その為要素の値を利用することはできますが、要素の値を変更することは出来ません。”とのこと。

で、この解決法が無いのか探したら有りました。それが参照渡し(リファレンス渡し)です。方法は変数の前に$を付けるだけ笑

変数の前に「&」を付けることで要素の値に対する参照を設定することができ、要素の値を変更することが可能になります。

ということで、正解は

$ score = array(70,80,90);

foreach($score as &$value){

  $value = $value * 0.9;

}

unset($value);

 

var_dump($score);

結果:array(3) { [0]=> float(63) [1]=> float(72) [2]=> float(81) }

でめでたしめでたし。絶対に忘れてはいけないのが最後のunset($value)。これをしないと$valueの中にまだ配列の最後の要素の参照が入っているのでその後のプログラムで値を書き換えてしまって思わぬバグを生む可能性があります。

C/C++出身の僕としてはポインタとかメンドクサイはあまりいい思い出が無いので思い出したくないです笑

 

参考文献

foreach文で配列要素の値を変更する - 繰り返し処理 - PHP入門