php的foreach语法的判定结构内部有个特点:
as后跟的变量定义范围是全局范围,即是说会替换掉foreach结构之前定义的同名变量,例如:
$array = array(1,2,3,4,5,6,7);
foreach ($array as $array){
echo $array;
$a = 1;
}
var_dump($array);
echo $a;
result:
1234567
int 7
1
如例所示,foreach结束后,foreach内部最后给予$array变量的值将会替换掉foreach之前已经定义好的值。
但是这里有个蹊跷,为什么既然会替换掉之前定义的同名变量,在foreach的过程中,却不会有错误中止,就在进行第二次循环的时候,$array数组应该已经变成简单数值型了。
基于这个例子结果,证明php的foreach判定结构内的来源数组在做提取时会做一份拷贝为foreach专用,当foreach结束时,这份拷贝会被清除,但是在foreach的过程中,foreach的来源数组自动指向这份只存在内存中的拷贝,无论在foreach过程中对源数组做什么变更,在foreach结束之前都不会影响到foreach按照原来的数组运转。
因此,为了减少变量使用和代码简洁的目的,在foreach结束后不会再使用到源数组的前提下,可以考虑foreach判定体内提取出的数组单项命名为与源数组同名。