Правильная работа со ссылками

egaz

Новичок
Здравствуйте.
Решил немного ускорить код программы:
вместо работы в foreach по ключу ($array[$key]),
сделал работу через ссылку на значение ($value).

Наткнулся на непонятную мне работу/ошибку PHP 5.3.8:
PHP:
<?php
$p=array();
$p[0]=array(0);
$p[1]=array(1);
print_r($p);

$i=0;
foreach($p as $key => &$value) {
        echo $value[0],"\n";
        $value[1]=$i++;
}
print_r($p);

foreach($p as $key => $value) {
        echo $value[0],"\n";
}
print_r($p);
?>
на выходе имею:
Код:
Array (
    [0] => Array (
            [0] => 0
        )
    [1] => Array (
            [0] => 1
        )
)
0
1
Array (
    [0] => Array (
            [0] => 0
            [1] => 0
        )
    [1] => Array (
            [0] => 1
            [1] => 1
        )
)
0
0
Array (
    [0] => Array (
            [0] => 0
            [1] => 0
        )
    [1] => Array (
            [0] => 0
            [1] => 0
        )
)
Первый print_r показывает структуру, всё верно
Второй print_r показывает обновлённую, поля добавлены верно.
Но идущий за ним echo в foreach выводит одинаковые значения.
Третий print_r это подтверждает, значения убились.

Такое происходит даже при пустом втором foreach, что свело меня с ума.
Кто может подтвердить/проверить, опровергнуть/разъяснить?
Спасибо.
 

egaz

Новичок
Читаем тут http://php.net/manual/ru/control-structures.foreach.php с этих строк "Ссылка $value на последний элемент массива остается даже"
Спасибо. Помнил про это, но не осилил, как foreach без тела
может перебивать значения массива, если $value остался ссылкой на конец массива.
 

Ragazzo

TDD interested
egaz
В следующем foreach в value записывается первый элемент массива, это массив, где все 0, соотвественно, т.к. $value указывает на последний массив, то ему присвоиться первый, у которого все 0. так понятней? :D
 
Сверху