phpのforeachで一つ前の要素を変更する

投稿日:2019年04月15日 08時36分02秒

知らないというのは罪ですってのがあって、phpのコマンドやら色々調べてみてます。
まあ実際変態言語ですわね。出来ないことがない。
最近知ったのがforeachで要素の内容を変更できるっていう奴です。
3つの値からなるarrayの2番めの要素(key==1)を変更してみます。
この時にforeachの受け側を$key => &$valueと参照にすれば変更が可能です。

$ary = array("first","second","third");
foreach( $ary as $key => &$value){
    if( $key == 1 ){
        $value = "弐";
    }
}
unset($value);
var_dump($ary);

実行すると結果は

array(3) {
  [0]=>
  string(5) "first"
  [1]=>
  string(3) "弐"
  [2]=>
  string(5) "third"
}

となります。変更はされていますが、最後から2行目のunsetが気になりますよね。これがないと結果はこうなります。

array(3) {
  [0]=>
  string(5) "first"
  [1]=>
  string(3) "弐"
  [2]=>
  &string(5) "third"
}

最後の要素が参照になってしまいます。これはつまり&$valueというものを参照した結果が表示されているのですね。ループの後で$valueに適当な値を入れると配列の値も変わってしまいます。。。!!ということはこれをうまく使えば1つ前のループの値等変更出来るのでは?と思いやってみました。
$lastは前回の参照を保存しているつもりです。初回は只の変数なので代入されるだけですが、2回目からは参照を指し示しているので、一つ前の参照が変更されるはずです。

$ary = array("aa","bb","cc");
foreach( $ary as $key => &$value){
     echo "value={$value}\n";
     $last = $key;
     $last = &$value;
}
unset($value);
unset($last);
var_dump($ary);

結果は下記の通りとなります。3回のループで直前の参照を変更するので0,1,2というキーについて0,1が変更されます。予想通りですね。

value=aa
value=bb
value=cc
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  string(2) "cc"
}

今までforで添字使ってたり連想配列だったりするものについてforeachで変更できるようになりました!

[<< PHPでテンプレートエンジンを作る2]

[BOOTSTRAPが使えるCMS「Nyanko PRESS」を作りました >>]