Во время работы над проектом, который проверяет, связаны ли модели Laravel друг с другом, я заметил некоторое (странное?) Поведение указателя в PHP. Ниже приведен минимальный пример для воспроизведения того, что я нашел.
<code><?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 '
';
}
Сначала я ожидал, что дампы в этом ответе будут возвращать одни и те же данные:
[ ['a'], ['b'], ['c'] ]
Но это не то, что случилось, я получил следующие ответы:
[ ['a'], ['b'], ['c'] ]
[ ['a'], ['b'], ['a'] ]
[ ['a'], ['b'], ['b'] ]
[ ['a'], ['b'], ['b'] ]
Работающий пример можно найти здесь .
Почему указатели действуют таким образом? Как я могу обновить $letter
в первом цикле без необходимости делать $arr[$key] = $letter
?
Редактировать: Поскольку люди, похоже, не понимают, почему существует второй цикл foreach
, это означает, что массив изменяется без переназначения