Rumah > pembangunan bahagian belakang > tutorial php > php 引用foreach输出问题

php 引用foreach输出问题

WBOY
Lepaskan: 2016-06-06 20:36:01
asal
858 orang telah melayarinya

<code><?php $arr = array('1','2');
foreach($arr as &$value){

}
foreach($arr as $value){
    var_dump($value);
}
</code></code>
Salin selepas log masuk
Salin selepas log masuk

输出

<code>string(1) "1"
string(1) "1"
</code>
Salin selepas log masuk
Salin selepas log masuk

谁给解释一下?

回复内容:

<code><?php $arr = array('1','2');
foreach($arr as &$value){

}
foreach($arr as $value){
    var_dump($value);
}
</code></code>
Salin selepas log masuk
Salin selepas log masuk

输出

<code>string(1) "1"
string(1) "1"
</code>
Salin selepas log masuk
Salin selepas log masuk

谁给解释一下?

这样解释吧,把foreach展开成赋值的话

<code>foreach($arr as &$value) {
    //noop
}
</code>
Salin selepas log masuk

大致是

<code>php</code><code>#begin first foreach
$value = &$arr[0];
//noop
$value = &$arr[1];
//noop
#end foreach
</code>
Salin selepas log masuk

这时候如果打印$arr,你会看到

<code>array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  &string(1) "2"
}
</code>
Salin selepas log masuk

也就是说$value仍然是$arr[1]的引用(别名)

然后我们再把第二个foreach拆开

<code>php</code><code>#begin second foreach

$value = $arr[0];//note: 由于$value  &$arr[1], 此时$arr[1]被赋值成为$arr[0],也就是1

var_dump($value);//1

$value = $arr[1];//相当于$arr[1] = $arr[1]; 没有实际效果

var_dump($value);//1

#end foreach

</code>
Salin selepas log masuk

解决方案是永远不要用&

或者老老实实按照官网的指示,用unset解除引用

<code><?php $arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
</code>
Salin selepas log masuk

$value 和 $arr[1] 指向同一个内存空间了,第二个循环每次循环实际上改的都是$arr[1]的值

学习了,根据上面的答案简单点来说。
第一个foreach结束后,$value = &$arr[1],注意,这里是引用,可以理解为指针
重点在第二个foreach:
第一次是&$arr[1] = $arr[0],这个是赋值操作,这个时候$arr[1]的值已经已经被修改为$arr[0]了,也就是1.此时$arr = ['0'=>1,'1'=>1].
第二次&$arr[1] = $arr[1],同上.最终$arr = ['0'=>1,'1'=>1].

Label berkaitan:
php
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan