Речь идет о PHP, но я не сомневаюсь, что многие из тех же комментариев применимы и к другим языкам.
Проще говоря, в чем разница между разными типами циклов для PHP? Один быстрее / лучше, чем другие, или я должен просто ввести наиболее читаемый цикл?
for ($i = 0; $i < 10; $i++)
{
# code...
}
foreach ($array as $index => $value)
{
# code...
}
do
{
# code...
}
while ($flag == false);






Я использую первый цикл при итерации по обычному (индексированному?) Массиву и цикл foreach при работе с ассоциативным массивом. На мой взгляд, это просто кажется естественным, помогает потоку кода и становится более читабельным. Что касается циклов do ... while, я использую их, когда мне нужно сделать больше, чем просто пролистать массив.
Однако я не уверен в каких-либо преимуществах в производительности.
В любом случае производительность существенно не улучшилась. Хотя это полезно для более сложных задач, чем повторение, но for и while функционально эквивалентны.
Foreach хорош, но имеет одно важное предостережение: вы не могу изменить перечислимого, которое вы повторяете. Так что никакого удаления, добавления или замены записей в / в нем. Конечно, можно изменять записи (например, изменять их свойства).
С помощью цикла foreach копия исходного массива создается в памяти для использования внутри. Не стоит использовать их на больших конструкциях; простой цикл for - лучший выбор. Вы можете более эффективно использовать цикл while для большой не числовой индексации, например такой:
while(list($key, $value) = each($array)) {
Но такой подход особенно уродлив для простой небольшой конструкции.
Циклы while лучше подходят для перебора потоков, или как в следующем примере, который вы очень часто видите в PHP:
while ($row = mysql_fetch_array($result)) {
Почти всегда разные контуры взаимозаменяемы, и все сводится к а) эффективности или б) ясности.
Если вам известны компромиссы эффективности различных типов циклов, то да, чтобы ответить на ваш исходный вопрос: используйте тот, который выглядит наиболее чистым.
Что касается производительности, foreach потребляет больше ресурсов, чем for.
Это CS101, но, поскольку никто об этом не упомянул, циклы while оценивают свое состояние до блока кода, а do-while оценивают после блока кода, поэтому циклы do-while всегда гарантированно запускают свой блок кода хотя бы один раз, независимо от состояния.
Каждая конструкция цикла служит разным целям.
for - используется для цикла для определенного количества итераций.
foreach - используется для перебора всех значений в коллекции.
while - используется для цикла до тех пор, пока вы не встретите условие.
Из трех вариантов «while», скорее всего, обеспечит лучшую производительность в большинстве ситуаций. Конечно, если вы сделаете что-то вроде следующего, вы в основном переписываете цикл for (который в C# немного более производительный).
$count = 0;
do
{
...
$count++;
}
while ($count < 10);
Все они имеют разные основные цели, но могут использоваться примерно одинаково. Это полностью зависит от конкретной проблемы, которую вы пытаетесь решить.
@brendan:
Статья, которую вы процитировали, сильно устарела, а информация просто неверна. Особенно последний пункт (используйте for вместо foreach) вводит в заблуждение, и обоснование, предлагаемое в статье, больше не применимо к современным версиям .NET.
Хотя это правда, что IEnumerator использует виртуальные вызовы, эти может фактически встроены современным компилятором. Кроме того, .NET теперь знает обобщенные типы и строго типизированные перечислители.
Существует множество тестов производительности, которые убедительно доказывают, что for, как правило, не быстрее foreach. Вот пример.
Ссылка мертвая.
With a foreach loop, a copy of the original array is made in memory to use inside.
Foreach is nice, but has one important caveat: you can't modify the enumerable you're iterating.
И то, и другое не будет проблемой, если вы передадите ссылку вместо значения:
foreach ($array as &$value) {
Я думаю, что это разрешено с PHP 5.
При доступе к элементам массива для ясности я бы использовал foreach, когда это возможно, и использовал бы только for, если вам нужны фактические значения индекса (например, тот же индекс в нескольких массивах). Это также сводит к минимуму вероятность ошибок опечатки, поскольку циклы for делают это слишком легко. В общем, PHP может быть не тем местом, где слишком много беспокоиться о производительности. И последнее, но не менее важное: for и foreach имеют (или должны иметь; я не PHP-er) одно и то же время Big-O (O (n)), поэтому вы, возможно, смотрите на небольшое количество большего использования памяти или небольшое постоянное или линейное попадание во времени.
Циклы 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 - ваш друг :)
Производительность очень редко является мотивирующим фактором при выборе петли.