2016年10月26日 星期三

PHP foreach 使用 reference 修改值

PHP array 使用 foreach 時,可以直接將代表值的變數($v),指定為 reference(&$v)
如此,可方便直接對值修改:
foreach ($arr as &$v){
    $v = $v*10;
}
.....

但這樣使用時須注意,最後須記得將 reference 變數 unset,
避免 reference 變數仍指到陣列的元素,不注意時,可能造成非預期的修改。
$arr = array("A", "B", "C");
foreach ($arr as &$v){
}
var_dump($arr);
foreach ($arr as $key => $v) {
    echo "{$key} => {$v}\n";
    var_dump($arr);
}
輸出結果,可發現第2次的freach,最後一個元素一直改變,
因為 reference 變數 $v 還一直代表著陣列最後一個元素,所以一直被重新賦值。
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  &string(1) "C"
}

0 => A
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  &string(1) "A"
}
1 => B
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  &string(1) "B"
}
2 => B
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  &string(1) "B"
}



使用完馬上unset(&$v),可避免非預期的最後一個元素值一直改變
$arr = array("A", "B", "C");
foreach ($arr as &$v){
}
unset($v);
var_dump($arr);
foreach ($arr as $key => $v) {
    echo "{$key} => {$v}\n";
    var_dump($arr);
}
輸出結果
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}

0 => A
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}
1 => B
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}
2 => C
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}




參考:
PHP: foreach - Manual

沒有留言:

張貼留言