foreach循环-php-奇怪的行为

foreach循环-php-奇怪的行为,php,foreach,Php,Foreach,我是PHP新手,正在尝试 现在使用PHP中的一些foreach循环。 我知道建议取消设置 foreach循环变量位于循环之后。 我注意到如果我包括//1//和 //2/,此脚本将打印正确的内容。 ... Name: Rachel, Age: 56 Name: Grace, Age: 44 (如果在最后一个循环中,我使用了other,它也会打印正确的内容 变量名,如$n和$a,而不是$name和$age。) 但如果我将行//1//和//2//注释掉,它会打印: Name: Lisa, Age:

我是PHP新手,正在尝试
现在使用PHP中的一些foreach循环。

我知道建议取消设置
foreach循环变量位于循环之后。

我注意到如果我包括//1//和
//2/,此脚本将打印正确的内容。

... 
Name: Rachel, Age: 56
Name: Grace, Age: 44
(如果在最后一个循环中,我使用了other,它也会打印正确的内容
变量名,如$n和$a,而不是$name和$age。)

但如果我将行//1//和//2//注释掉,它会打印:

Name: Lisa, Age: 28
Name: Jack, Age: 16
Name: Ryan, Age: 35
Name: Rachel, Age: 46
Name: Grace, Age: 34

Name: Lisa, Age: 38
Name: Jack, Age: 26
Name: Ryan, Age: 45
Name: Rachel, Age: 56
Name: Grace, Age: 56
请注意,56打印了两次。
为什么它会这样做?
我的意思是:引擎盖下发生了什么事?


Hm。。不知道你为什么不安

更简单:

    $employee_age = array(
    "Lisa"   => 28,
    "Jack"   => 16,
    "Ryan"   => 35,
    "Rachel" => 46,
    "Grace"  => 34);

    foreach( $employee_age as $name => $age){
        echo "Name: $name, Age: $age <br />";
    }

    echo "<br>";

    foreach( $employee_age as $name => $age){
        $age2 = $age + 10; // (Don't think this is required)
        echo "Name: $name, Age: $age2 <br />"; // Try with just $age+10
    }

?>
$employee\u age=array(
“Lisa”=>28,
“杰克”=>16岁,
“Ryan”=>35,
“Rachel”=>46,
“宽限期”=>34);
foreach($name=>$age的员工年龄){
echo“姓名:$Name,年龄:$Age
”; } 回声“
”; foreach($name=>$age的员工年龄){ $age2=$age+10;//(不认为这是必需的) echo“Name:$Name,Age:$age2
”;//只需$Age+10即可 } ?>
Grace=56,因为您的代码是

foreach( $employee_age as $name => &$age){
    $age += 10;
}
换成

foreach( $employee_age as $name => $age){
    $age += 10;
}
如果在第二个循环之前
var\u dump($employee\u age)
,你会注意到最后一个条目是
&int
,而不是
int
。这仍然是一个参考。它指向最后一个元素(忽略自身)。那是56岁的瑞秋

查看手册中的警告:

即使在foreach循环之后,$值和最后一个数组元素的引用仍然保留。建议通过unset()将其销毁


这是PHP对引用项的行为

原因:我认为这比我更重要

只是一个小备忘录

或者,要解决此问题,您可以在第三个foreach中将
&
添加到
$age

foreach($name=>员工年龄和$age){
echo“姓名:$Name,年龄:$Age
”; }

为什么要使用
&
然后在第二个循环中?Jelle,这回答了我问题的哪一部分?Peter,我修改了你的代码,所以它不应该给你这个问题。就个人而言,我不喜欢通过引用处理变量。如果你需要保留修改后的年龄,我会在数组中工作,以清楚地知道你什么时候在更改。好的,我得到你的答案:它基本上说“避免这样做”。谢谢但正如我所说,我只是在学习foreach循环,发现了这种奇怪的行为。好的,我知道如何让它工作好的,NP。我只是不知道为什么它是56的两倍。好问题。如果这是一个bug,我也不会感到惊讶。我会远离这样的结构,只需要取消引用您需要的内容,比如
$employee[$name]+=10。可读性更强,不易出错。
$age
$name
变量仅在
foreach
范围内可用。所以取消设置它们没有效果…@Mathlight显然它有效果。@Mathlight他的观点是,它确实有效果。只需取消注释
//unset($age);//1/
行,代码就行了。从什么时候开始,
34+10=56
?他想让Grace 44岁。好吧,我知道它们仍然存在,但最后一个循环不会覆盖它们吗?为什么错误发生在最后一个循环的最后一次迭代而不是第一次迭代@彼得·彼得罗夫我想你要找的是“ThanakronTandavas”你为什么要删除你的答案?我想这与我的问题最为接近。谢谢我将阅读您提供的页面。简而言之:$employee_age['Grace']指向$age。因此,每次使用$age时,它都会被覆盖。你可以想象,如果你
var\u dump($employee\u age)
在最后一个foreach循环中。@peter.petrov我想Sbls已经回答了你要找的问题。好吧,这是一个非常奇怪的行为,我想任何来到PHP的人都会同意,但是你提供的链接很好地解释了为什么它会这样:)再次感谢。没问题。同意,阿尼穆森♦ 很好地解释了这种行为。我不同意这里的“修复部分”。如果您希望销毁引用,请使用
unset($age)在您使用过的foreach之后。@GlavićTrue。因为那个家伙已经使用了
unset($age)foreach( $employee_age as $name => &$age){
    echo "Name: $name, Age: $age <br />";
}