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;
这会将该成员的值设置为 !!!
,准确给出您所看到的数据结构。
有人可以解释一下,为什么这段代码可以正常工作而不会破坏初始数组结构?
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;
这会将该成员的值设置为 !!!
,准确给出您所看到的数据结构。