Сведения о вопросе

Математик

05:05, 27th August, 2020

Теги

php   loops    

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

Просмотров: 448   Ответов: 11

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

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

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


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


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



  Сведения об ответе

ASSembler

11:01, 7th August, 2020

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

Операторы внутри этого блока цикла 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 - это ваш друг :)


  Сведения об ответе

prince

16:58, 19th August, 2020

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


  Сведения об ответе

screen

19:54, 25th August, 2020

PHP контрольные показатели


  Сведения об ответе

SILA

19:35, 27th August, 2020

@brendan:

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

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

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


  Сведения об ответе

Chhiki

21:06, 1st October, 2020

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

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

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

 foreach ($array as &$value) {

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


  Сведения об ответе

PHPH

01:22, 7th August, 2020

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


  Сведения об ответе

dumai

15:21, 23rd August, 2020

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

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


  Сведения об ответе

lats

05:31, 22nd August, 2020

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

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


  Сведения об ответе

screen

10:26, 15th August, 2020

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

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

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

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

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

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

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


  Сведения об ответе

ITSME

12:05, 5th August, 2020

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

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


  Сведения об ответе

lool

20:11, 1st August, 2020

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

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

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться