代码如下:
$hosts = array(

       '118',
       '140',
       '124',
       '125',
       '135',
);
foreach ($hosts as &$h){
       echo "$h \n";
       $h = "192.168.1.{$h}";
       echo "$h \n";
}

foreach ($hosts as $h){
       echo "after:$h \n";
}

结果执行的结果出人意料:
118
192.168.1.118
140
192.168.1.140
124
192.168.1.124
125
192.168.1.125
135
192.168.1.135
after:192.168.1.118
after:192.168.1.140
after:192.168.1.124
after:192.168.1.125
after:192.168.1.125

最后一行实在是难以理解,不知道是我写的代码差,还是php的bug。
分析原因是:
第二个foreach时,$h一直都是指向$hosts最后一个元素,每次as的时候,就把$hosts的最后一个元素替换为foreach遍历的值,到倒数第二个时,$hosts[-1] 等于$hosts[-2]。
到循环的最后一条时, 取出$hosts[-1]就是192.168.1.125.

我最后想到的解决方法就是第一个foreach以后使用unset($h) 重置$h的指向地址。

而由此得出的结论就是,php的引用垃圾无比,千万不要使用。 在php用&的人都是在和自己过不去。
 

标签: none

添加新评论