Я пытаюсь понять, как работают ссылки, но я застрял, пытаясь следовать логике программирования того, что именно делает этот код, когда он проходит через массив. Я пытаюсь понять, что происходит, шаг за шагом.
Я прочитал сообщения 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]