Можете объяснить почему следующий код так работает.
<?php
$a = array(3, 3, 0, 2, 1);
foreach($a as &$v)//жёсткая ссылка
{
echo $v;//перебрал массив
}
foreach($a as $v)
{
echo $v;//всё норм, только 5 элемент будет 2(равен 4-му)
}
?>
Спустя 18 минут, 50 секунд (7.01.2012 - 15:07) Jack_White написал(а):
При использовании переменной-ссылки в foreach, изменяется содержание, на которое она ссылается.
В мануале
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// do something
}
echo $ref; // 3 - последнее значение, используемое в цикле
?>
В мануале
Спустя 30 минут, 15 секунд (7.01.2012 - 15:37) Бобр Добр 2012 написал(а):
стоп! а разве переменная row не локальна для цикла и не удаляется после выполнения цикла?
ну то есть rew и row (их связь) не имеет ни кого отношения к имени переменной в цикле
ну то есть rew и row (их связь) не имеет ни кого отношения к имени переменной в цикле
Спустя 8 минут, 14 секунд (7.01.2012 - 15:46) Jack_White написал(а):
В твоем случае ссылка меняет последнее значение массива на предпоследнее
Спустя 24 минуты, 3 секунды (7.01.2012 - 16:10) Placido написал(а):
Цитата |
Внимание Ссылка $value на последний элемент массива остается даже после того, как оператор foreach завершил работу. Рекомендуется уничтожить ее с помощью функции unset(). |
Если более подробно, то после того как отработал первый foreach, $v остается ссылкой на последнюю ячейку массива $a ($a[4]). Во втором foreach с каждым циклом значение $a[] поочередно присваивается переменной $v и, соответственно, ячейке $a[4]. И таким образом, на предпоследнем цикле $v и $a[4] принимают значение a[3]. Для того чтобы этого не происходило, после первого foreach следует уничтожить $v с помощью unset().
<?php
$a = array(3, 3, 0, 2, 1);
foreach($a as &$v){
echo $v;
}
unset($v);
foreach($a as $v)
{
echo $v;
}
?>
----
Поправил, не $a[3], а $a[4].
Спустя 22 минуты, 51 секунда (7.01.2012 - 16:33) Бобр Добр 2012 написал(а):
спасибо всем! разобрался