寻路启示

On 六月 30, 2011, in 自言自语, by pensz

每次吃完晚饭回家,都要沿一条大道走回去。从距离来讲,我知道走这条路绕路了,但是由于这条路是我同事带我走过的,是被证实过没有问题的,加上这块区域十字路口多,所以我不大愿意,也不敢去发掘新的路线,一则晚上想回去歇着;二则晚上人的辩路能力下降。有探过一次路,但以失败告终。

但就在前几天,我非常不服气,不再愿意多走那几步路。因此又鼓起勇气,开始寻找起路来。在决定走新路之前,脑子里有了一些想法:

1 确定行走的大方向,沿着这个方向应该能够走到我住的地方;

2 遇到十字路口,选择自己住的地方地理位置近的方向走,而不关心前面的路到底是怎么样。

期望最好的结果是顺利到家;还有可能的差一点结果是到达我熟悉的大街上,再从那条熟悉的大街走回住的地方,再差的情况,那就是死胡同了(由于人类的伟大,这种可能不大,最多就是往回走上一段,再重新寻找路径)。

有了这些想法(类A*算法嘛)后,最短路径就这样被我发掘到了,没有遇到任何困难。回想起之前的那一次寻路,心中更多的是慌乱,从而失去了基本的判断能力,最后连自己怎么回来的也不曾记得。

人在不熟悉的环境中总是容易放大自己的困难,从而丧失很多自己本来拥有的判断能力,这就是我这一次寻路的启示。

 

php中”怪异”的循环

On 六月 9, 2011, in 技术记录, by pensz

前不久在打酱油的时候发现了一个诡异的问题,遍历php数组,竟然结果有问题。具体就是最后一个元素的值和倒数第二个元素的值一样。最后打算去bugs.php.net上搜索一下是不是真的是bug,结果不是bug,有人也报告了这个问题,具体地址请移步至 http://bugs.php.net/bug.php?id=50582 。

问题代码:

Reproduce code:
---------------
$ii = array(1, 2, 3);
foreach ($ii as &$i) echo $i;
foreach ($ii as $i) echo $i;

Expected result:
----------------
123123

Actual result:
--------------
123122

rasmus的解释如下:

It doesn't act weird.  There is no block scope in PHP, so at the end of
the first loop $i is a reference to the last element of $ii and in the
second loop you are now assigning values to that reference which means
you are overwriting the 3rd element of $ii each time through the loop.
That of course means that once you get to the 3rd element of $ii it is
no longer 3 and you see the last value assigned to it, which was 2.

意思就是说:php中没有块作用域,故变量 $i 的作用域不仅仅存在于第一个循环,而是存在与整个代码中,经过第一个循环后,$i 为 $ii最后一个元素的引用;第二个循环的作用就是不断将当前数组中各个元素的值赋值给$ii的最后一个元素,故最后一个元素的值为倒数第二个元素的值。

解决方法就是:

1 第二个循环中不用 $i

2 第一个循环结束后 unset($i)

Tagged with: