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

PHP自相矛盾(怪异)的行为。通过引用将数组发送到函数,php,arrays,pass-by-reference,Php,Arrays,Pass By Reference,有人能给我解释一下,为什么这段代码在不破坏初始数组结构的情况下正常工作 function setArrayValueByPath($path, $value, &$array) { foreach ($path as $p) { $array = &$array[$p]; } $array = $value; return true; } $array = [ 'a' => 'v1', 'b' => '

有人能给我解释一下,为什么这段代码在不破坏初始数组结构的情况下正常工作

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>';
由于线路的功能:

foreach ($path as $p) {
它应该替换$array值,但不会发生

我的函数基于以下代码段:
谢谢。

让我们一步一步地检查一下

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

    $array = &$array[$p];
这将在
['hello','world']

}
获取原始数组,并使用
$p
(即[hello])对其进行“索引”。该数组当前不存在,因此将其添加到原始数组中。然后引用该新成员并将其保存在局部变量
$array
中。也就是说,您刚刚创建了原始数组的一个新成员,而局部变量
$array
不再指向原始外部数组

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

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

这将该成员的值设置为
,提供您所看到的数据结构。

尽管on-SO要求避免在评论中使用“谢谢”,但我仍然在此感谢您,先生。好。。现在看起来很清楚,但我是否正确使用不同名称的变量使代码更易于理解要好得多?
}
$array = $value;