foreach循环-php-奇怪的行为
我是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中的一些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 />";
}