PHP foreach 循环不更新值

Rog*_*use 5 php foreach

如果如下所示的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)

Shl*_*sid 2

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 之前加上 &。在这种情况下,该值将通过引用分配。