这是关于PHP但我毫不怀疑许多相同的评论将适用于其他语言。
简单地说,PHP的不同类型的循环有什么不同?是一个比其他人更快/更好还是我应该简单地放入最易读的循环?
for ($i = 0; $i < 10; $i++)
{
# code...
}
foreach ($array as $index => $value)
{
# code...
}
do
{
# code...
}
while ($flag == false);
答案 0 :(得分:10)
For循环和While循环是进入条件循环。它们首先评估条件,因此如果条件无法满足
,则与循环关联的语句块将不会运行一次此for循环块内的语句将运行10次,$ i的值将为0到9;
for ($i = 0; $i < 10; $i++)
{
# code...
}
使用while循环完成同样的事情:
$i = 0;
while ($i < 10)
{
# code...
$i++
}
Do-while循环是退出条件循环。保证执行一次,然后在重复块
之前评估条件do
{
# code...
}
while ($flag == false);
foreach用于从头到尾访问数组元素。在foreach循环开始时,数组的内部指针被设置为数组的第一个元素,在下一步中它被设置为数组的第二个元素,依此类推,直到数组结束。在循环块中当前数组项的值可用作$ value,当前项的键可用作$ index。
foreach ($array as $index => $value)
{
# code...
}
你可以用while循环做同样的事情,比如这个
while (current($array))
{
$index = key($array); // to get key of the current element
$value = $array[$index]; // to get value of current element
# code ...
next($array); // advance the internal array pointer of $array
}
最后:The PHP Manual是你的朋友:)
答案 1 :(得分:1)
这是CS101,但由于没有其他人提到它,while循环在代码块之前评估它们的条件,并且do-while在代码块之后进行求值,因此do-while循环总是保证在以下位置运行它们的代码块至少一次,不论条件如何。
答案 2 :(得分:1)
答案 3 :(得分:1)
@brendan:
您引用的文章严重过时,而且信息完全错误。特别是最后一点(使用for
而不是foreach
)会产生误导,文章中提供的理由不再适用于现代版本的.NET。
虽然IEnumerator
使用虚拟调用是正确的,但这些可以实际上由现代编译器内联。此外,.NET现在知道泛型和强类型枚举器。
有很多性能测试可以最终证明for
通常不会比foreach
快。 Here's an example
答案 4 :(得分:0)
在迭代传统(索引?)数组时使用第一个循环,在处理关联数组时使用foreach循环。在我看来,它看起来很自然,有助于代码流动,更具可读性。至于do ... while循环,当我必须做的不仅仅是翻转数组时,我会使用它们。
但我不确定是否有任何性能优势。
答案 5 :(得分:0)
在任何一种情况下,性能都没有明显改善。虽然对于比迭代更复杂的任务有用,但for
和while
在功能上是等效的。
Foreach
很不错,但有一个重要的警告:你无法修改你正在迭代的可枚举数。因此,不能删除,添加或替换条目。当然,修改条目(比如改变它们的属性)是可以的。
答案 6 :(得分:0)
使用foreach循环,在内存中创建原始数组的副本以在内部使用。你不应该在大型建筑物上使用它们;一个简单的for循环是一个更好的选择。您可以在大型非数字索引结构上更有效地使用while循环,如下所示:
while(list($key, $value) = each($array)) {
但对于一个简单的小结构来说,这种方法尤其难看。
while循环更适合循环流,或者如下例中您在PHP中经常看到的那样:
while ($row = mysql_fetch_array($result)) {
几乎所有时间不同的循环都是可以互换的,它可以归结为a)效率,或b)清晰度。
如果您知道不同类型循环的效率权衡,那么回答您原来的问题:使用看起来最干净的问题。
答案 7 :(得分:0)
关于性能,foreach比for
更耗费答案 8 :(得分:0)
每个循环结构都有不同的用途。
for - 用于循环特定次数的迭代。
foreach - 用于遍历集合中的所有值。
while - 这用于循环,直到你遇到一个条件。
在三者中,“while”很可能在大多数情况下提供最佳性能。当然,如果你做了类似下面的事情,你基本上都在重写“for”循环(在c#中性能略高一些)。
$count = 0;
do
{
...
$count++;
}
while ($count < 10);
它们都有不同的基本用途,但它们也可以以相同的方式使用。这完全取决于您要解决的具体问题。
答案 9 :(得分:0)
使用foreach循环,在内存中创建原始数组的副本以在内部使用。
Foreach很好,但有一个重要的警告:你不能修改你正在迭代的可枚举。
如果您通过引用而不是值传递,那么这两个都不会成为问题:
foreach ($array as &$value) {
我认为从PHP 5开始就允许这样做。
答案 10 :(得分:0)
访问数组的元素时,为了清楚起见,我会尽可能使用foreach,并且只有在需要实际索引值时才使用for(例如,多个数组中的相同索引)。这也最大限度地减少了拼写错误的可能性,因为循环使得这太容易了。一般来说,PHP可能不是太过担心性能的地方。最后但并非最不重要的是,for和foreach已经(或应该拥有;我不是PHP-er)相同的Big-O时间(O(n))所以你可能会考虑更少的内存使用量或在时间上略微恒定或线性的击中。