# 1.11 循环结构

循环,这个太常用了。我们为什么使用计算机,而不是手动一个一个处理,就是因为计算机善于处理循环的结构。把最枯燥的部分,扔给机器,它喜欢这样。

循环的应用场景,很多。比如对于数组的处理,我们在程序当中,总是有很多规格的数据要处理,转化,转换,格式化。而数组,也即是我们本书所要讲的重点知识,在PHP中非常常见。

PHP中的循环结构,有3中语法结构。

  1. for循环
  2. foreach循环
  3. while循环

1 - for循环

话不多说,直接上代码。看下面这段:


java break能跳出white吗 java break跳出几层循环_html for循环


for语句内位置参数,第一个是循环因子的初始值,第二个是跳出循环的判断条件,第三个是运行式。

上述代码中,在条件判断else中使用continue语句,表示,这一轮算了,就这样了,不要管了,直接开始下一轮循环吧。默认跳出一层循环。如果循环层数多了,可以指定跳出几层。

下面我们举一个直观的例子,大家在视觉上对for循环有个认识。我们输出10个进度条,分别从10%-100%,递加10%。

为了说明效果,HTML和PHP混合写了,大家知道这个运行机制就可以了,这不是最佳实践。

注意样式是使用的bs。

老规矩,在浏览器内访问 www.array.com/chapter1.5.php ,刷新后效果如下图:


java break能跳出white吗 java break跳出几层循环_html for循环_02


怎么样,效果是不是很直观。一共10个循环,每次递增10,展示出来就是这样了。

2 - foreach循环

foreach

foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。

你如果曾留意一些框架,或者代码库,对此君一定不会陌生。没错儿,到处都是它。

先列举几个简单的列子,大家看一看,应该就能明白语法结构了。


java break能跳出white吗 java break跳出几层循环_java break能跳出white吗_03


$temp是一个数组。再看复杂一些的:


java break能跳出white吗 java break跳出几层循环_html for循环_04


这次循环的时候使用 $k=>$v结构,$k保留索引值,$v保留数值。

PHP内的foreach循环大抵如此。我们使用时,大可不必考虑数组长度,只用考虑数组是一个什么结构,是关联数组,还是一维简单数组,对应处理即可。

3 - while循环

while循环用的也应该算是最低的,为什么?一不留神,死循环!会一直到PHP的timeout时间30秒。这是不允许出现的。

还是通过代码认识一下其结构。


java break能跳出white吗 java break跳出几层循环_java break能跳出white吗_05


上面这段代码,是对文件的操作句柄$fp,判断其是否到了文件结尾feof()函数。

如果不是文件末尾,继续循环。执行结构体内的语句。

当然,上面代码中使用if判断语句,如果执行到一行,没有任何字符,仅仅是换行符,这个说明是空行,那也直接执行break。这也能跳出循环

有时候为了写一个命令行运行的文件,要守护进程,永远不过期,永远不退出,那可能就需要一个死循环,用云运行下去。下面的代码看一下:


java break能跳出white吗 java break跳出几层循环_for循环数据量太大_06


大家看,这就是一个while(true)典型的死循环。为什么这么用?因为我们不知道到底要处理多少数据,不知道到底有多少循环。因此只能这样,硬着头皮走下去,那么在遇到合适的跳出条件时,使用break跳出循环。

在订单处理中,预先不能预估数据量的话,不用这样的办法,可用的选择似乎并不多。

为了加深印象,我们再看一个完整的函数:


java break能跳出white吗 java break跳出几层循环_for循环数据量太大_07


上述函数解析url内的query string部分,类似 a=1&b=3&c=9这样,一个一个地截断操作。知道将字符串字段到最后没有任何值,那么strlen($nvpstr) === 0,这时候while循环退出,函数返回。

大家完全可以发挥想象力,使用这简单的结构,构造出复杂的应用。