语法结构
foreach($array$key=>$value){ $value; } foreach($array$value){ $value; }
说明
遍历给定的数组 $array ,在每次循环时,当前单元的值被赋值给 $value(若设置了 $key 那么就会同时将键值也赋值给 $key),同时数组内部的指针向前移一步,从而在下一个循环中得到下一个单元。在这个过程中,所有的操作都是对指定数组 $array 的一个拷贝操作,而不是对 $array 数组本身。也就是无论你如何修改这个 $value , 原数组 $array 都不会有任何改变,因为它只是一个克隆体。
$array= [ "a"=>"a", "b"=>"b", "c"=>"c", ]; foreach ($array$value) { $value .="-copy"; } $array); (
结果:
如果我们想在循环的同时修改 $array 本身,那么我们可以使用引用赋值的方式:
foreach ($array&$value) { $value .="-copy"; } $array); (
可以看到结果中 $array 中的值已经被修改了。那么什么是引用赋值呢?
引用赋值就是让新变量指向原变量,一旦新变量的值发生了改变,那么原来的变量值也会跟着改变。从内存图上我们可以看出引用赋值与传值赋值的区别:
因此引用赋值后,变量 $b 发生改变后 $a 也将发生改变。此时,如果我们基于上面引用赋值后的 foreach 后再进行一次循环,此时不做任何改变直接输出 $value 值:
$array= [ "a"=>"a", "b"=>"b", "c"=>"c", ]; foreach ($array&$value) { $value .="-copy"; } foreach ($array$value) { "$value"; } $array); (
结果:
或许我们预期希望输出的是:
---
但结果却不对,原因就在于变量 $value 上。分析可知在第一遍引用赋值后,$value 指向 $array 的键值为 c 的值,接着在第二次进行循环时,$value 的值在不停被改变,这就等于 $array["c"] 的值被不停被改变,其过程如下:
为了避免这种情况,我们需要在第一遍循环引用赋值后,执行 unset($value) 来释放变量,这样就可以得到正确的结果了。