知らないというのは罪ですってのがあって、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で変更できるようになりました!
Copyright(c) 2015-2023 Birdland Ltd. All Rights Reserved.