如果如下所示的PHP程序存储在bug.php中,那么这个命令
php bug.php
Run Code Online (Sandbox Code Playgroud)
使用 PHP 7.0.33-0ubuntu0.16.04.1 (cli) ( NTS ) Zend Engine v3.0.0,版权所有 (c) 1998-2017 Zend Technologies 和 Zend OPcache v7.0.33-0ubuntu0.16.04.1 时将生成此输出,版权所有 (c) 1999-2017,Zend Technologies
输出:
Initial array
Array
(
[0] => aa
[1] => bb
)
j = 0 line = aa
element 0 is aa
j = 1 line = bb <----------------------------------------------
element 1 is ***bb <----------------------------------------------
Final array
Array
(
[0] => aa
[1] => ***bb
)
Run Code Online (Sandbox Code Playgroud)
注意上面标记的线。元素 $A[1] 是“***bb”,而 $line(foreach 应与键 1 关联)是“bb”。
这是一个错误,还是有一些我不知道的 PHP 微妙之处?
<?php
$A = array
(
"aa",
"bb",
);
echo "Initial array\n";
print_r($A);
foreach ($A as $j => $line)
{
echo "j = $j line = $line\n";
echo "element $j is {$A[$j]}\n\n";
if ($j == 0)
$A[1] = "***" . $A[1];
}
echo "Final array\n";
print_r($A);
?>
Run Code Online (Sandbox Code Playgroud)
foreach
该数组作为副本传递给,除非您将其作为引用传递(表明通过&
向 中添加 a $value
),否则它将不会反映您在第一次迭代中所做的值的更新。
考虑一下:
foreach ($A as $j => &$line)
{
echo "j = $j line = $line\n";
echo "element $j is {$A[$j]}\n\n";
if ($j == 0)
$A[1] = "***" . $A[1];
}
/* Will output:
* j = 0 line = aa
* element 0 is aa
*
* j = 1 line = ***bb
* element 1 is ***bb
*/
Run Code Online (Sandbox Code Playgroud)
您会看到,&line
这意味着我们正在向块传递一个引用,现在任何更改都会反映到数组,而不是$line
您传递到循环块的初始数组的副本。
希望我说清楚了...
我注意到文档准确地说:
为了能够在循环内直接修改数组元素,请在 $value 之前加上 &。在这种情况下,该值将通过引用分配。