Вопрос

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

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

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


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


do
{
    # code...
}
while ($flag == false);
Это было полезно?

Решение

Циклы 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 твой друг :)

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

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

@Брендан:

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

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

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

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

Однако я не уверен в каких-либо преимуществах производительности.

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

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

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

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

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

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

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

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

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

Каждая конструкция цикла служит своей цели.

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

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

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

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

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

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

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

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

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

 foreach ($array as &$value) {

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

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

Что касается производительности, foreach требует больше времени, чем for.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top