Понимание логики foreach со ссылками – Почему первый элемент изменен на «два», второй на «три», а третий на «три3»?

Я пытаюсь понять, как работают ссылки, но я застрял, пытаясь следовать логике программирования того, что именно делает этот код, когда он проходит через массив. Я пытаюсь понять, что происходит, шаг за шагом.

Я прочитал сообщения PHP.net и понимаю, что при использовании ссылок в foreach массива вам нужно отключить переменную. Я также понимаю, что код ниже не лучший код. Я просто использую его для обучения, чтобы следовать логике потока программирования о том, как PHP-интерпретатор работает через другой код.

Мой вопрос в том, что делает этот код каждый раз, когда он проходит через этот массив, чтобы заставить его выводить следующее, если я не отменю ($ v)? Другими словами, что он делает шаг за шагом, чтобы заставить массив иметь «два» в качестве первого элемента, «три», как второй элемент, и «три3» в качестве третьего?

$arr = array(1=>'one',2=>'two',3=>'three'); foreach($arr as $k=>$v){ $v = &$arr[$k]; $v .= $k; echo $v . "\n"; //unset($v) .... if I use unset($v) here, then the resulting $arr is correct. } 

выход …

 one1 two2 three3 Array ( [1] => two [2] => three [3] => three3 ) 

Большое спасибо за помощь!!

Первый раз через цикл

 foreach($arr as $k=>$v){ // Sets $v to a value of "one" $v =& $arr[$k]; // Sets $v as a reference to $arr[1] ("one") $v .= $k; // Sets $v (and hence also $arr[1]) to "one1" 

Второй раз через цикл

 foreach($arr as $k=>$v){ // Sets $v to a value of "two"... // because $v is already set as a reference to $arr[1] from the previous loop, // this changes $arr[1] to a value of "two" $v =& $arr[$k]; // Sets $v as a reference to $arr[2] ("two") // It no longer references $arr[1] so $arr[1] will not be changed any further $v .= $k; // Sets $v (and hence also $arr[2]) to "two2" 

Третий раз через цикл

 foreach($arr as $k=>$v){ // Sets $v to a value of "three"... // because $v is already set as a reference to $arr[2] from the previous loop, // this changes $arr[2] to a value of "three" $v =& $arr[$k]; // Sets $v as a reference to $arr[3] ("three") // It no longer references $arr[2] so $arr[2] will not be changed any further $v .= $k; // Sets $v (and hence also $arr[3]) to "three3" 

Если вы используете функцию unset ()

Первый раз через цикл

 foreach($arr as $k=>$v){ // Sets $v to a value of "one" $v =& $arr[$k]; // Sets $v as a reference to $arr[1] ("one") $v .= $k; // Sets $v (and hence also $arr[1]) to "one1" unset($v); // Unsets $v as a reference, it no longer points to $arr[1] 

Второй раз через цикл

 foreach($arr as $k=>$v){ // Sets $v to a value of "two"... // As $v is no longer set as a reference to $arr[1], // this leaves $arr[1] unchanged by this loop $v =& $arr[$k]; // Sets $v as a reference to $arr[2] ("two") $v .= $k; // Sets $v (and hence also $arr[2]) to "two2" unset($v); // Unsets $v as a reference, it no longer points to $arr[2] 

Третий раз через цикл

 foreach($arr as $k=>$v){ // Sets $v to a value of "three"... // As $v is no longer set as a reference to $arr[2], // this leaves $arr[2] unchanged by this loop $v =& $arr[$k]; // Sets $v as a reference to $arr[3] ("three") $v .= $k; // Sets $v (and hence also $arr[3]) to "three3" unset($v); // Unsets $v as a reference, it no longer points to $arr[3]