В сишном коде явно видно что в первом цикле указатель меняет адрес, а во втором - не меняет.
В пхп-шном это тоже видно (хоть и так ясно, согласен), что в первом цикле $v используется в качестве ссылки, а во втором - в качестве значения.
Вопрос - должна или не должна обнуляться ссылка? - спорный и вот почему.
foreach ($a as $k => $v) {}
по окончании цикла $v будет равно последнему элементу.
foreach ($a as $k => &$v) {}
Тогда вполне логично, что после такого цикла $v будет ссылкой на последний элемент. Почему же она должна автоматически ансетиться?
В сишном коде,
явным образом описано то же, что делает пхп (упрощенно, конечно). C Ruby, к сожаленью не знаком, но вижу в коде два идентичных цикла, в то время как в примере на PHP они разные. Вообще в Ruby разве есть ссылки?
В Perl, например, они есть, но там вопрос решен - переменная-итератор локализуется в цикле.
#!/usr/bin/perl
my $v = 6789;
my @a = (1,2,3,4,5);
for $v(@a) { # $i - ссылка
}
print $v; # выведет 6789
Если бы переменная $v не была объявлена ранее, то ничего бы не вывел. Ну считай, да, как если бы она обнулялась.
Короче, это всё я к чему. Выстрелить себе в ногу можно разными способами. Главное, чтобы эти способы были описаны в мануале :)