Первый цикл foreach не вносит никаких изменений в массив, как мы и ожидали.Однако это заставляет $v
назначать ссылку на каждый из элементов $a
, так что к моменту окончания первого цикла $v
фактически является ссылкой на $a[2]
.
Как только начинается второй цикл, $v
назначается значение для каждого элемента.Однако $v
уже является ссылкой на $a[2];
, поэтому любое присвоенное ему значение будет автоматически скопировано в последний элемент массива!
Таким образом, во время первой итерации $a[2]
станетноль, затем один, а затем еще один, будучи эффективно скопирован на себя.Чтобы решить эту проблему, вы всегда должны сбрасывать значения переменных, которые вы используете в циклах foreach по ссылкам, или, что еще лучше, вообще не использовать первые.