如果在 foreach 定义中正确分配变量,则通过引用的 foreach 不起作用

问题描述 投票:0回答:1

有人可以解释一下为什么这两个代码片段返回不同的值吗?

$z = [[1,2,3],[4,5,6]];
foreach($z as &$i)
{
    $i[] = 6;
}
echo json_encode($z), "\n";; // prints [[1,2,3,6],[4,5,6,6]]

// VS    

foreach($z = [[1,2,3],[4,5,6]] as &$i)
{
    $i[] = 6;
}
echo json_encode($z), "\n"; // prints [[1,2,3],[4,5,6]] 

我本来希望将 $z 分配给数组会发生在 foreach 之前,但是将分配放在 foreach 中会导致存储在 $z 中的数组不会受到附加到 $i 末尾的影响数组。

php arrays foreach reference
1个回答
2
投票

赋值表达式的值是被赋值的表达式,而不是对其赋值的变量的引用。所以你的第二个版本相当于:

$temp_z = [[1,2,3],[4,5,6]];
$z = $temp_z;
foreach ($temp_z as &$i) {
    $i[] = 6;
}

所以引用的是保存文字值的临时数组,而不是

$z
中的数组。

© www.soinside.com 2019 - 2024. All rights reserved.