Разница между петлями

Речь идет о PHP, но я не сомневаюсь, что многие из тех же комментариев применимы и к другим языкам.

Проще говоря, каковы различия в различных типах цикла для PHP? Один быстрее / лучше, чем другие, или я должен просто поместить в наиболее читаемый цикл?

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


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


do
{
    # code...
}
while ($flag == false);
22.08.2008 16:32:33
Производительность очень редко является мотивирующим фактором при выборе цикла.
Ollie Saunders 25.10.2009 08:56:59
11 ОТВЕТОВ
РЕШЕНИЕ

Циклы 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 внутренний указатель массива устанавливается на первый элемент массива, на следующем шаге он устанавливается на 2-й элемент массива и так далее до конца массива. В блоке цикла Значение текущего элемента массива доступно как $ 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 - ваш друг :)

10
23.08.2008 01:44:16

Я использую первый цикл при переборе по обычному (индексированному?) Массиву и цикл foreach при работе с ассоциативным массивом. На мой взгляд, это кажется естественным и помогает потоку кода и быть более читабельным. Что касается циклов do ... while, я использую их, когда мне нужно больше, чем просто пролистывать массив.

Я не уверен ни в каких преимуществах производительности, все же.

0
22.08.2008 16:34:58

Производительность не значительно лучше в любом случае. Хотя это полезно для более сложных задач, чем итерации, но forи whileфункционально эквивалентны.

Foreachэто хорошо, но есть одно важное предостережение: вы не можете изменять перечисляемое, которое вы повторяете. Поэтому не нужно удалять, добавлять или заменять записи в / в нем. Изменение записей (например, изменение их свойств), конечно, нормально.

0
22.08.2008 16:37:42

С помощью цикла foreach в памяти создается копия исходного массива для использования внутри. Вы не должны использовать их на больших структурах; простой цикл - лучший выбор. Вы можете использовать цикл while более эффективно для большой не числовой индексированной структуры, например:

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

Но такой подход особенно уродлив для простой небольшой структуры.

Циклы while лучше подходят для циклического прохождения потоков или как в следующем примере, который вы очень часто видите в PHP:

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

Практически все время различные циклы взаимозаменяемы, и это сводится либо к а) эффективности, либо к б) ясности.

Если вам известны компромиссы эффективности различных типов циклов, то да, чтобы ответить на свой оригинальный вопрос: используйте тот, который выглядит наиболее чистым.

0
22.08.2008 16:37:44

Что касается производительности, foreach является более потребляющим, чем для

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

0
24.01.2013 13:09:59

Это CS101, но поскольку никто другой не упомянул об этом, в то время как циклы оценивают свое состояние перед блоком кода, а do-while оценивает после блока кода, поэтому цикл do-while всегда гарантированно запускает свой блок кода хотя бы один раз, независимо от состояния.

1
22.08.2008 16:46:47
1
22.08.2008 16:48:12

Каждая циклическая конструкция служит для разных целей.

for - это используется для цикла для определенного количества итераций.

foreach - используется для циклического перебора всех значений в коллекции.

while - Используется для зацикливания, пока не будет выполнено условие.

Из трех «время», скорее всего, обеспечит наилучшую производительность в большинстве ситуаций. Конечно, если вы делаете что-то вроде следующего, вы в основном переписываете цикл for (который в c # немного более производительный).

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

Все они имеют разные основные цели, но их также можно использовать несколько одинаково. Это полностью зависит от конкретной проблемы, которую вы пытаетесь решить.

0
22.08.2008 17:39:03

@brendan:

Статья, которую вы цитировали, серьезно устарела, а информация просто неверна. Особенно последний пункт (использование forвместо foreach) вводит в заблуждение, и обоснование, предлагаемое в статье, больше не относится к современным версиям .NET.

Хотя это правда, что IEnumeratorиспользуются виртуальные вызовы, они могут быть встроены современным компилятором. Кроме того, .NET теперь знает обобщенные и строго типизированные перечислители.

Существует множество тестов производительности, которые убедительно доказывают, что, forкак правило, не быстрее, чем foreach. Вот пример .

1
22.08.2008 17:52:33
Ссылка мертва.
edigu 21.02.2017 10:41:58

С помощью цикла foreach в памяти создается копия исходного массива для использования внутри.

Foreach хорош, но имеет одно важное предостережение: вы не можете изменять перечисляемое, которое вы повторяете.

И то и другое не будет проблемой, если вы передадите ссылку по значению вместо значения:

 foreach ($array as &$value) {

Я думаю, что это было разрешено начиная с PHP 5.

0
22.08.2008 23:30:52

При доступе к элементам массива, для ясности, я бы использовал всякий раз foreach, когда это возможно, и использовал бы только для for, если вам нужны фактические значения индекса (например, один и тот же индекс в нескольких массивах). Это также сводит к минимуму вероятность опечаток, поскольку циклы делают это слишком простым. В общем, PHP может не беспокоиться о производительности. И последнее, но не менее важное, потому что и foreach имеют (или должны иметь; я не PHP-эр) одно и то же время Big-O (O (n)), поэтому вы, возможно, смотрите на небольшое увеличение использования памяти или небольшое постоянное или линейное попадание во времени.

0
22.08.2008 23:47:01