PHP-foreach中引用缺陷


近期使用php開發過程中,發現一個foreach中引用的小坑。

1.現象

如下代碼:

$arr = [1, 2, 4];

foreach ($arr as &$a) {
    $a = $a * $a;
}
print_r($arr);
foreach($arr as $a){
    print_r($a);
    print(" ");
}

打印結果:

Array
(
    [0] => 1
    [1] => 4
    [2] => 16
)
1 4 4 

2.原因

爲什麼在第一次遍歷中使用引用後,第二次遍歷最後一個元素結果異常?
問題解釋官方參考中可以知道foreach“引用”後,數組中最後一個元素的引用仍會保留,需要手動刪除,即應在第一次遍歷後添加unset($a);

3.分析

打印如下:

$arr = [1, 2, 4];

foreach ($arr as &$a) {
    $a = $a * $a;
}
print_r($arr);
foreach($arr as $k=>$a){
    printf("----------------\n%d => %s\n", $k, $a);
    print_r($arr);
}

打印結果:

Array
(
    [0] => 1
    [1] => 4
    [2] => 16
)
------------
0 => 1
Array
(
    [0] => 1
    [1] => 4
    [2] => 1
)
------------
1 => 4
Array
(
    [0] => 1
    [1] => 4
    [2] => 4
)
------------
2 => 4
Array
(
    [0] => 1
    [1] => 4
    [2] => 4
)

由上可以理解,在第一次遍歷foreach中使用引用後,$a仍然是數組的末尾元素的引用。第二次遍歷foreach時,相當於一直在對末尾元素做“賦值”覆蓋操作;當執行到最後一步時,末尾元素自己對自己覆蓋,原本的值來源於上一次覆蓋,即倒數第二個元素的值,所以最後一個元素輸出異常。

參考文章:PHP foreach使用 &引用 的坑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章