PHP的foreach语句使用引用变量的问题

今天在执行一个PHP程序的时候遇到一个诡异的问题:将数组print_r出来的数据是正确的,但使用foreach遍历数组时,倒数第2条记录的内容被改成了倒数第3条的,把foreach中的其它无关语句删除了也还是同样问题,foreach如下:

print_r($users_all);  //数据是正确的

foreach ( $users_all as $k => $u ) {//其中一条内容被篡改成了另外一条
  printf("%d - %s, tid:%d, uid:%d\n", $k, $u['section'], $u['tid'], $u['uid']);
}

 

这个诡异的问题一时让我摸不着头脑,我只能往前查看代码是否有一些可疑的地方,修改一些地方并加入了一些调试语句,竟莫名其妙的就正常了,经过一番分析总算找到了原因:在多个采用引用赋值的foreach内使用相同的变量名

 

在上面的代码前有下面2个foreach结构:

foreach ( $users_pri as &$u ) {

    ...

}

 

foreach ( $users_sec as &$u ) {

    ...

}

$users_all = array_merge($users_pri, $users_sec);

这2个foreach内都是用$u这个变量来引用数组记录,这导致$users_sec内的数据在使用foreach遍历时出现了不确定现象,将引用赋值改成拷贝赋值后就好了;按理说$u是在foreach内定义的,应该是一个局部变量,不应该产生全局效应,而且引起不确定的影响,这个应该是PHP的一个缺陷吧,本人不才不知其中的深层原因,待高人来分析。

 

 

 

 

 

posted @ 2010-09-19 18:25  edwardlost  阅读(2945)  评论(3编辑  收藏  举报