在检查Laravel模型之间是否相关的项目中,我注意到PHP出现了一些奇怪的指针行为。以下是一个最小化的示例,可以重现我发现的情况。
<?php
$arr = ['a', 'b', ['c']];
foreach($arr as &$letter) {
if (!is_array($letter)) {
$letter = [$letter];
}
}
dump($arr);
foreach($arr as $letter) {
dump($arr);
}
function dump(...$dump) {
echo '<pre>';
var_dump($dump);
echo '</pre>';
}
起初我预期这个响应中的所有转储都将返回相同的数据:
[ ['a'], ['b'], ['c'] ]
但事实并非如此,我收到了以下回复:
[ ['a'], ['b'], ['c'] ]
[ ['a'], ['b'], ['a'] ]
[ ['a'], ['b'], ['b'] ]
[ ['a'], ['b'], ['b'] ]
一个可运行的示例可以在这里找到。
为什么指针会这样工作?如何在第一个循环中更新$letter
而不必执行$arr[$key] = $letter
?
编辑:由于人们似乎误解了为什么有第二个foreach
循环,这是为了表明数组在不重新分配的情况下发生了变化。
foreach
循环显示不同的输出。 - Dexter