【PHP】バグ?foreach($arr as &$item)←この&をつけると起きる変な挙動に注意!

foreach($arr as &$item){
//ループ
}

PHPには、&をつけた状態でforeachループを回すと$itemが上書きできる便利な機能があります。

ですが、unset();を実行するのを忘れるとひどい目にあいます。

配列の最後だけおかしな値(こと)になるとすれば、原因はコレかもしれません。

<?php

$arr=["a","b","c"];
foreach($arr as &$item){

}

print_r($arr); //array("a","b","c")が出力されます。

foreach($arr as $item){
}

print_r($arr); //array("a","b","b")が出力されます。

/*ループ内部で何も処理を書いていないにも関わらず、配列最後の部分が置換されてしまいます。*/
?>

こんな不思議な現象が起こってしまいます。PHPの困った仕様の一つです。

勝手に配列の一部が変わってしまうなんて、初めて遭遇した方はとても戸惑われるのではないでしょうか。

PHPマニュアルによると

PHP 5 以降、$value の前に & を付けることで、 容易に配列の要素の値を変更できるようになっています。 これにより、値をコピーするのではなく、 リファレンス が代入されます。
[略]
警告
foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなります。 unset() でその参照を解除しておくようにしましょう。

ということらしいです。

<?php

$arr=["a","b","c"];
foreach($arr as &$item){

}
unset($item);

foreach($arr as $item){
}

print_r($arr); //array("a","b","c")が出力されます。

/*unset()を行ったので今度は想像通りの結果を得ることができました。*/
?>

ポインタとして使った変数を必ずunset();する必要があるので、foreachを使うときは十分注意してくださいね。

コメント

お知らせ

羽織紐を手作りしてます!よろしければご覧ください!
  • 天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
    天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
  • 天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
    天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
  • 天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー
    天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー

お知らせ

羽織紐を手作りしてます!よろしければご覧ください!
  • 天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
    天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
  • 天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
    天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
  • 天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー
    天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー
タイトルとURLをコピーしました