PHP 自相矛盾(怪异)的行为。通过引用发送数组到函数

PHP paradoxical (weird) behavior. Sending array to function by reference

有人可以解释一下,为什么这段代码可以正常工作而不会破坏初始数组结构?

function setArrayValueByPath($path, $value, &$array)
{
    foreach ($path as $p) {
        $array = &$array[$p];
    }
    $array = $value;
    return true;
}

$array = [
    'a' => 'v1',
    'b' => 'v2',
];
setArrayValueByPath(['hello', 'world'], '!!!', $array);

echo '<pre>';
print_r($array);
echo '</pre>';

当我 运行 代码时,我看到:

Array
(
    [a] => v1
    [b] => v2
    [hello] => Array
        (
            [world] => !!!
        )

)

由于函数中的行:

$array = $value;

它应该替换 $array 值,但它没有发生。

我的功能基于此处给出的代码片段:Using a string path to set nested array data 谢谢。

让我们一步一步来检查。

参数 $array 是函数中的一个 局部变量 ,它包含对传入的某些外部数组的引用。

foreach ($path as $p) {

这遍历 ['hello', 'world']

    $array = &$array[$p];

取原始数组,"index"它与$p(即[hello])。这目前不存在,因此将其添加到原始数组中。然后引用该新成员并将其保存在 局部变量 $array 中。 IE。你刚刚在原数组中新建了一个成员,局部变量$array不再指向原外部数组.

在第二次迭代中,获取当前由 $array 指向的变量(见上文)并使用 $p (world) 对其进行索引。这个不存在,所以创建它。

}

此时$array指向成员{original array}[hello][world]。我在这里使用语法 {original array} 因为您不再有对它的引用,只有对嵌套在其中的两层数组的引用。

$array = $value;

这会将该成员的值设置为 !!!,准确给出您所看到的数据结构。