foreach($arr as &$item){
//ループ
}
PHPには、&をつけた状態でforeachループを回すと$itemが上書きできる便利な機能があります。
ですが、unset();を実行するのを忘れるとひどい目にあいます。
配列の最後だけおかしな値(こと)になるとすれば、原因はコレかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?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() でその参照を解除しておくようにしましょう。
ということらしいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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を使うときは十分注意してくださいね。
コメント