循环执行结构

wile、for

找到最小可重复的单元。合理的调整重复单元各个操作的顺序,使其更符合逻辑。如果实在没有办法必要,提前手写第一圈循环。或者手写最后一圈循环。

while-for

循环内部嵌套if。但是if又不是必要的,只是在最后的时候,才需要判断,而前面的又不需要。

有几个这样的场景,1、join函数(类似的还有 where中的and),2、base64函数。

场景的代码如下:

<?php
$arr = range(1,3);

$len = count($arr);
$resut = '';
foreach($arr as $k=>$v){
    if($k==$len-1){
        $resut .= $v;
        continue;
    }
    $resut .= $v . ' and ';
}

echo $resut; //1 and 2 and 3

但是上面的代码,是能优化的。if大部分场合,都是命中失败的,也就是我们希望for里面,尽量减少这个if判断,提高代码的执行效率。所以,上面代码优化为:

<?php
$arr = range(1,3);
$len = count($arr);
$resut = '';
// 处理前面不需要if的部分
foreach(array_slice($arr,0,-1) as $k=>$v){
    $resut .= $v . ' and ';
}
//最后一圈循环
$resut .= $arr[$len-1];
echo $resut;

这样就消灭了for中的if判断。但是,上面的代码,也确实有代价,要分开处理,代码势必要比前一种复杂一些。性能有提升?也未必。(所以写代码,我个人觉得实现一种方案,然后再优化)

step不等于1

按顺序遍历,自己计算在大的数组中的索引。

Function get_top()
	' 通过遍历找到第一个可见元素的top,作为调整的依据
	Dim cur ' tables的元素
	
	For i = 1 To 30
		'  index = start_index + (i - 1) * 3 + 2 可以计算一个索引,然后更直接的,找到当前遍历的元素
		cur = tables[start_index + (i - 1) * 3 + 2] 
		If cur["right"] - cur["left"] > 30 Then 
		    get_top = cur["top"]
		    print_msg "获取到第一个可见游戏(左:"& cur["left"] &",顶:"& cur["top"] &",右:"& cur["right"] &",底:"& cur["bottom"] &")的高度为:"& cur["top"] &"。"
		    Exit Function
		End If
	Next
	get_top = -1 '没有找的的情形
End Function

或者,直接设置stop。