2008-08-22 2 views
6

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

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

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


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


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

Производительность очень редко является мотивирующим фактором в выборе а петля. – 2009-10-25 08:56:59

ответ

10

Для циклов цикла и While являются петлями состояния ввода. Сначала они оценивают условие, поэтому блок-оператор, связанный с циклом, не будет работать один раз, если условие не соответствует

Операторы внутри этого цикла цикла будут выполняться 10 раз, значение $ i будет равно 0 9;

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

То же самое делается с While Loop:

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

Do-то время цикл выхода условие цикла.Это гарантировано выполнить один раз, то он будет оценивать состояние перед повторением блока

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

Еогеаспа используется для доступа к элементам массива от начала до конца. В начале цикла foreach внутренний указатель массива устанавливается в первый элемент массива, на следующем шаге он устанавливается на 2-й элемент массива и так далее до окончания массива. В блоке цикла Значение текущего элемента массива доступно как $ value, а ключ текущего элемента доступен как $ index.

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

Вы могли бы сделать то же самое с в то время как петли, как этот

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 
} 

И наконец: The PHP Manual ваш друг :)

0

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

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

0

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

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

0

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

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

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

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

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

Почти все время разные петли являются взаимозаменяемыми, и он придет вплоть до a) эффективности, или b) ясности.

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

1

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

0

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

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

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

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

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

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

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

1

@brendan:

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

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

Есть много тестов производительности, которые убедительно доказывают, что for обычно не превышает foreach. Here's an example.

+0

Ссылка мертва. – edigu 2017-02-21 10:41:58

0

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

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

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

foreach ($array as &$value) { 

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

0

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