我不知所措。告诉我有什么问题。
我正在尝试正确更改 foreach 循环内关联数组的元素的值。
我设置了数组的初始值并显示在屏幕上:
$arr=array(1,2);
print_r($arr);
结果:
Array
(
[0] => 1
[1] => 2
)
然后在循环中我将数组元素设置为新值。我使用了“&”符号,以便在循环内可以更改这些值\u200b\u200b:
foreach ($arr as $k => &$v) $v = $k*2;
检查:
print_r($arr);
我得到了我的预期:
Array
(
[0] => 0
[1] => 2
)
但后来我不知道发生了什么。两个选项(更改行的顺序):
1)第一个选项:
foreach ($arr as $k => &$v) echo " [$k] => $v".PHP_EOL;
foreach ($arr as $k => $v) echo " [$k] => $v".PHP_EOL;
结果:
[0] => 0
[1] => 2
[0] => 0
[1] => 0
使用“&”的第一个循环输出我需要的内容。第二个循环输出零。为什么?
2)第二个选项(而不是第一个),更奇怪(我们只改变循环的顺序):
foreach($arr as $k=>$v) echo " [$k] => $v".PHP_EOL;
foreach($arr as $k=>&$v) echo " [$k] => $v".PHP_EOL;
我们得到:
[0] => 0
[1] => 0
[0] => 0
[1] => 0
哦哦...
& 用作指向变量的指针,以便能够不使用数组的副本,而是使用 foreach 循环中元素的真实值,这一事实是可以理解的。不清楚为什么 print_r 输出与 foreach 循环中的输出不同。
为什么当我交换两个字符串时 foreach 输出不同。看来我没有在输出中使用赋值操作...
PS PHP 版本 7.0.33-0
循环结束后
$v,仍然引用数组的最后一个元素,下一个循环重用这个变量进行赋值。这种重用的一个例子:它将推断出
int(5)最好不要在循环内通过引用更改值的另一个原因。按键改变值的时候,没有这种意想不到的效果。如果你只写一个程序,这个问题并没有那么可怕。如果在没有足够测试覆盖的大型旧程序中间的某个地方添加了一个循环引用的值更改,则可能会产生更不愉快的后果。在这里,调试时会遇到麻烦和头痛,当意外的值无缘无故地爬出意外的地方时。当然,如果您知道这种危险,那么这是您将在代码中寻找的第一件事,但是如果您知道它,那么您不会在不使用函数或其他东西包装此操作的情况下添加像那样。