一个蛋疼的foreach引用问题,搞的我很郁闷。

简直浪费时间,演示代码。

public function test()
{
    $teams = [
        1 => 'a',
        2 => 'b',
        3 => 'c',
        4 => 'd',
    ];

    foreach ($teams as $key => &$team) {
        //some code 1
    }

    foreach ($teams as $key => $team) {
        // some code 2
    }
    echo json_encode($teams);
}

输出:

{"1":"a","2":"b","3":"c","4":"c"}

结论,倒数第一个的值会修改为倒数第二个的值一样。

修改1:在第一个foreach结束后unset($team);;

foreach ($teams as $key => &$team) {
//some code 1
}

unset($team);

foreach ($teams as $key => $team) {
//some code 2
}

修改2:两个foreach都使用引用&$team;

foreach ($teams as $key => &$team) {
//some code 1
}

foreach ($teams as $key => &$team) {
//some code 2
}

修改3:两个foreach使用不同的变量$team$team2;

foreach ($teams as $key => &$team) {
//some code 1
}

foreach ($teams as $key => $team2) {
//some code 2
}

修改1、修改2、修改3都可以得到符合预期的输出:

{"1":"a","2":"b","3":"c","4":"d"}
讨论数量: 2

一般来说,引用后最好清除引用 unset() ,不过你也可以不用相同的item变量

2年前 评论
ichynul (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!