这是关于PHP但我毫不怀疑许多相同的评论将适用于其他语言。

简单地说,PHP的不同类型的循环有什么不同? 是一个比其他更快/更好还是我应该简单地放入最可读的循环?

for ($i = 0; $i < 10; $i++)
{
    # code...
}


foreach ($array as $index => $value)
{
    # code...
}


do
{
    # code...
}
while ($flag == false);

===============>>#1 票数: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
}

最后: PHP手册是你的朋友:)

===============>>#2 票数:1

这是CS101,但由于没有其他人提到它,while循环在代码块之前评估它们的条件,并且do-while在代码块之后进行求值,因此do-while循环始终保证至少运行一次代码块,无论条件如何。

===============>>#3 票数:1

PHP基准测试

===============>>#4 票数:1

@brendan:

你引用的文章严重过时,信息完全错误。 特别是最后一点( for代替foreach )具有误导性,文章中提供的理由不再适用于.NET的现代版本。

虽然IEnumerator确实使用虚拟调用,但实际上这些调用可以由现代编译器内联。 此外,.NET现在知道泛型和强类型枚举器。

有很多的性能测试,在那里,证明是决定性for一般不会高于foreach 这是一个例子

===============>>#5 票数:0

我在迭代传统(索引?)数组时使用第一个循环,在处理关联数组时使用foreach循环。 在我看来,它看起来很自然,有助于代码流动,更具可读性。 至于do ... while循环,当我必须做的不仅仅是翻转数组时,我会使用它们。

不过,我不确定是否有任何性能优势。

===============>>#6 票数:0

无论哪种情况,性能都没有明显改善。 虽然对于比迭代更复杂的任务有用,但forwhile在功能上是等效的。

Foreach很好,但有一个重要的警告:你不能修改你正在迭代的可枚举。 因此,不能删除,添加或替换条目。 当然,修改条目(比如改变它们的属性)是可以的。

===============>>#7 票数:0

使用foreach循环,在内存中创建原始数组的副本以在内部使用。 你不应该在大型建筑物上使用它们; 一个简单的for循环是一个更好的选择。 您可以在大型非数字索引结构上更有效地使用while循环,如下所示:

while(list($key, $value) = each($array)) {

但对于简单的小型结构,这种方法尤其难看。

while循环更适合循环流,或者在PHP中经常看到的以下示例中:

while ($row = mysql_fetch_array($result)) {

几乎所有时间不同的循环都是可互换的,并且它将归结为a)效率或b)清晰度。

如果您知道不同类型循环的效率权衡,那么回答您原来的问题:使用看起来最干净的问题。

===============>>#8 票数:0

在性能方面,foreach比for还要多

http://forums.asp.net/p/1041090/1457897.aspx

===============>>#9 票数:0

每个循环结构用于不同的目的。

for - 用于循环特定次数的迭代。

foreach - 用于循环遍历集合中的所有值。

while - 这用于循环,直到你遇到一个条件。

在这三者中,“while”很可能在大多数情况下提供最佳性能。 当然,如果你做了类似下面这样的事情,你基本上是在重写“for”循环(在c#中性能略高一些)。

$count = 0;
do
{
   ...
   $count++;
}
while ($count < 10);  

它们都有不同的基本用途,但它们也可以以相同的方式使用。 这完全取决于您要解决的具体问题。

===============>>#10 票数:0

使用foreach循环,在内存中创建原始数组的副本以在内部使用。

Foreach很好,但有一个重要的警告:你不能修改你正在迭代的可枚举。

如果您通过引用而不是值传递,那么这两个都不会成为问题:

 foreach ($array as &$value) {

我认为这是从PHP 5开始就允许的。

===============>>#11 票数:0

访问数组的元素时,为了清楚起见,我会尽可能使用foreach,并且只有在需要实际索引值时才使用for(例如,多个数组中的相同索引)。 这也最大限度地减少了拼写错误的可能性,因为循环使得这太容易了。 一般来说,PHP可能不是太过担心性能的地方。 最后但并非最不重要的是,for和foreach已经(或应该有;我不是PHP-er)相同的Big-O时间(O(n))所以你可能会考虑更少的内存使用量或稍微恒定或线性击中的时间。

  ask by Teifion translate from so

未解决问题?本站智能推荐:

3回复

php中这两种类型的foreach()循环之间的技术区别?

在使用foreach(){...}循环时,我大多使用brackets ,但是foreach(): ... endforeach;是什么foreach(): ... endforeach; 循环吗? 这两种类型的foreach(){} vs foreach():...endforeach;
3回复

在foreach循环之间添加间隔

基本上,我的代码使用foreach循环为数组中的每个键执行一些代码。 但是,问题在于,这段代码访问的API每半分钟仅允许50个请求。 为了防止我的请求被阻止,我想在循环中添加一个计时器,以检查自此回合开始以来是否经过了至少一秒钟,然后才可以继续进行下一回合。 关于如何实施此建议?
1回复

克隆对象和普通对象之间的区别

在PHP中,当我在变量中创建克隆对象和使用具有相同类的变量创建的新对象时,它有何不同 例如 $b和$c什么区别?
5回复

仅在3个值之间循环

我正在尝试为每个div循环一个类。 我知道如何获得第一个和最后一个,但无法弄清楚如何迭代1-3(或更多的其他人想要扩展这个) 是)我有的: 但是,当我回显$i以查看发生了什么时,它每次都会添加值,而不是通过if语句(我认为这不会导致它增加数量) 我最终获得了这种输出:
2回复

PHP / MYSQL在数字之间循环相同的功能

我已经尝试解决了好几天,并且我确定合适的人可以轻松地做到这一点。 我需要插入的行数吗? 可以在某个时候派上用场吗? 我要完成的主要目标是: 尽可能简化我的代码。 我想使用此代码并将函数displayMatrixNumbers()粘贴到不同的DIV选项卡中100次
1回复

Smarty在变量之间(在循环中)打印白色空格吗?

从PHP分配: 在Smarty(v3.1.16) .tpl文件中: 然后它将输出为: ..之间有一个“空格” 。 我认为这只是在这样的循环中。 为什么会这样呢? 以及如何解决呢?
1回复

count()值和foreach()循环之间的差异计数

好吧,这超出了我的想象。 我必须遗漏一些明显的东西,但我找不到,是什么。 a)PHP脚本: b)结果: 怎么可能, count在某个变量上返回1 ( one ),然后,当将相同的变量放入foreach ,该循环实际上会循环4次?
3回复

将HTML代码放在php循环之间

我在php中有一个while循环,想在两者之间放置单选按钮。 像这样: 但是这里的代码来自 不起作用 实际上,我正在做一个从数据库中获取问题和答案的测验问题,这里fin_element分别由ID列表组成,以分别提取问题,因此一次应提取具有答案的多个问题。 请帮忙。
1回复

PHP:goto和另一个控制结构之间的区别是什么,比如[重复]

这个问题在这里已有答案: GOTO仍被视为有害吗? [已关闭] 49个答案 我检查了应用程序的操作码,发现goto命令执行JMP操作。 但是,某些结构如if , while和for也使用JMP类的goto 。 问题是: 1.为什么我们不应该使用goto
1回复

使用多个逻辑循环之间的打开和关闭HTML标签

我试图基本上循环并正确显示我的类别 1)如果深度为1(类别),我需要呼叫Div , H3和UL 2)如果深度等于2(子类别),则将其推入<li> 3)问题是,如果我检测到深度1并显示第一个Div ,则在深度2语句完成后,我不知道如何调用</div>结束标