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

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

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

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


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


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

Производительность очень редко является мотивирующим фактором при выборе петли.

Ollie Saunders 25.10.2009 11:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
1
2 248
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Я использую первый цикл при итерации по обычному (индексированному?) Массиву и цикл 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.

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

Это 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. Вот пример.

Ссылка мертвая.

edigu 21.02.2017 13:41

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 - ваш друг :)

Другие вопросы по теме