Странное поведение foreach, последний элемент перезаписывается предпоследним!?

Solid

Drosera anglica
Странное поведение foreach, последний элемент перезаписывается предпоследним!?

Специально для клаба состряпал небольшой кусок:

PHP:
$test_array = array(1, 2, 3);
foreach ($test_array as &$v) {}
foreach ($test_array as $v) {}
print_r($test_array);
Угадайте, что будет в результате?

Вопрос: каким образом последний элемент во второй итерации перезаписывается предпоследним элементом?
 

SiMM

Новичок
Вы же сами сделали $v ссылкой
PHP:
$test_array = array(1, 2, 3); 
$v = &$test_array[2];
$v = $test_array[1];
print_r($test_array);
Добавьте unset($v), например
PHP:
$test_array = array(1, 2, 3); 
foreach ($test_array as &$v) {} 
unset($v);
foreach ($test_array as $v) {} 
print_r($test_array);
Апаздал :)
 

Solid

Drosera anglica
itprog
Спасибо. Я уж подумал, что чего-то не понимаю...
 

Pigmeich

Новичок
Solid
Ну и стнадартный совет не использовать временную переменную более чем для одного дела.
 

QQQ

Новичок
Спасибо. Я уж подумал, что чего-то не понимаю...
а попробуй проследить, что именно происходит и врубишся:
Код:
<?
$test_array = array(1, 2, 3); 

foreach ($test_array as $k => $w) 
{
	$v = &$test_array[$k]; /* $v - ссылка на элемент массива */
}
/* по выходу из цикла $v ссылается на последний элемент массива */

 
foreach ($test_array as $w) 
{  
	$v = $w;	/* присваиваем значение элемента массива до этого определённой ссылке */
/* 
	Первый проход - последний элемент массива равен 1 
	Второй проход - последний элемент массива равен 2
	Третий проход - третий элемент массива равен сам себе (то-есть 2)
*/

} 

print_r($test_array);
?>
 

Solid

Drosera anglica
QQQ
Однако, умный.

Pigmeich
Это естественно. Просто когда целый день лепишь код, иногда случается... и пРоявляются такие вот баги.
 

bkonst

.. хочется странного?...
Просто потрясающий способ прострелить себе ногу.

(Особенно когда привычно, что переменная цикла имеет область видимости внутри этого цикла...)
 
Сверху