Подтвердить что ты не робот

For loop vs while loop vs foreach loop PHP

1st off Я новичок в PHP. Я использовал цикл loop, while, foreach в скриптах. Интересно, что

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

код, который я застрял, задаваясь вопросом, какой цикл использовать.

for($i=0;$i<count($all);$i++)
{
 //do some tasks here
 for($j=0;$j<count($rows);$j++)
 {
  //do some other tasks here 
 }
}

Довольно очевидно, что я могу написать вышеприведенный код, используя while. Надеюсь, кто-то поможет мне выяснить, какой цикл лучше использовать.

4b9b3361

Ответ 1

какой из них лучше для производительности?

Это не имеет значения.

какие критерии выбрать цикл?

Если вам просто нужно пройти через все элементы объекта или массива, используйте foreach. Случаи, в которых вам нужно for включить

  • Когда вам явно нужно делать что-то с числовым индексом, например:
  • когда вам нужно использовать предыдущие или следующие элементы из итерации
  • когда вам нужно изменить счетчик во время итерации

foreach гораздо удобнее, потому что он не требует от вас подсчета и может пробиваться через какой-либо элемент - будь то свойства объекта или ассоциативные элементы массива (которые for won ' t catch). Это обычно лучше всего для удобства чтения.

который должен использоваться, когда мы зацикливаемся внутри другого цикла?

Оба хороши; в вашем демонстрационном случае foreach - самый простой способ.

Ответ 2

какой из них лучше для производительности?

Кому это нужно? Это не будет значительным. Когда-либо. Если бы эти виды крошечных оптимизаций имели значение, вы бы не использовали PHP.

какие критерии выбрать цикл?

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

Это также может зависеть от стилистических правил (например, в Python вы почти всегда хотите использовать цикл foreach, потому что это "способ, которым это делается в Python" ). Я не уверен, что стандарт в PHP, хотя.

который должен использоваться, когда мы зацикливаемся внутри другого цикла?

Какой тип петель имеет наибольший смысл (см. ответ выше).

В вашем коде цикл for кажется мне совершенно естественным, поскольку у вас есть определенный индекс начала и остановки.

Ответ 3

Проверьте http://www.phpbench.com/ для хорошей ссылки на некоторые тесты PHP.

Цикл for обычно довольно быстрый. Не включайте свой счет ($ rows) или count ($ all) в себя, сделайте это так:

$count_all = count($all);
for($i=0;$i<$count_all;$i++)
{
    // Code here
}

Размещение count ($ all) в цикле for позволяет вычислить этот оператор для каждого цикла. Сначала вычисление значения, а затем использование вычисления в цикле заставляет его запускать только один раз.

Ответ 4

  • Для производительности не имеет значения, выбираете ли вы цикл for или while, количество итераций определяет время выполнения.
  • Если вы знаете количество итераций в forehand, выберите цикл for. Если вы хотите запустить и остановить условие, используйте цикл while

Ответ 5

  • для цикла более подходит, когда вы заранее знаете, сколько итерации для выполнения
  • В то время как цикл используется в противоположном случае (когда вы не знаете, сколько итерации)
  • Для каждого цикла лучше всего, когда вам нужно перебирать коллекции.

Насколько я знаю, разница в производительности между циклами while и циклами невелика, я не знаю о каждом цикле

Ответ 6

Производительность: Достаточно легко протестировать. Если вы делаете что-то вроде машинного обучения или больших данных, вы должны действительно смотреть на то, что составлено или собрано и не интерпретировано; если циклы действительно имеют значение. Ниже приведены некоторые ориентиры между различными языками программирования. Похоже, что цикл do-while является победителем в моих системах с использованием PHP с этими примерами.

$my_var = "some random phrase";

function fortify($my_var){
    for($x=0;isset($my_var[$x]);$x++){
        echo $my_var[$x]." ";
    }
}

function whilst($my_var){
    $x=0;
    while(isset($my_var[$x])){
       echo $my_var[$x]." ";
       $x++;
    }
}

function dowhilst($my_var){
    $x=0;
    do {
       echo $my_var[$x]." ";
       $x++;
    } while(isset($my_var[$x]));
}

function forstream(){
    for($x=0;$x<1000001;$x++){
        //simple reassignment
        $v=$x;
    }
    return "For Count to $v completed";
}

function whilestream(){
    $x=0;
    while($x<1000001){
        $v=$x;
        $x++;
    }
    return "While Count to 1000000 completed";
}

function dowhilestream(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x<1000001);
    return "Do while Count to 1000000 completed";
}

function dowhilestream2(){
    $x=0;
    do {
        $v=$x;
        $x++;
    } while ($x!=1000001);
    return "Do while Count to 1000000 completed";
}

$array = array(
    //for the first 3, we're adding a space after every character.
        'fortify'=>$my_var,
        'whilst'=>$my_var,
        'dowhilst'=>$my_var,
   //for these we're simply counting to 1,000,000 from 0
   //assigning the value of x to v 
        'forstream'=>'',
        'whilestream'=>'',
        'dowhilestream'=>'',
   //notice how on this one the != operator is slower than
   //the < operator
        'dowhilestream2'=>''
        );

function results($array){
    foreach($array as $function=>$params){


      if(empty($params)){
        $time= microtime();
        $results = call_user_func($function);  
      } elseif(!is_array($params)){
        $time= microtime();  
        $results = call_user_func($function,$params);
      } else {
        $time= microtime();  
        $results = call_user_func_array($function,$params);
      }
      $total = number_format(microtime() - $time,10);
      echo "<fieldset><legend>Result of <em>$function</em></legend>".PHP_EOL;
      if(!empty($results)){
          echo "<pre><code>".PHP_EOL;
          var_dump($results);
          echo PHP_EOL."</code></pre>".PHP_EOL;
      }
      echo "<p>Execution Time: $total</p></fieldset>".PHP_EOL;
    }
}

results($array);

Критерии: while, for и foreach - это основные структуры управления, которые большинство людей используют в PHP. do-while быстрее, чем while в моих тестах, но в основном недоиспользуется в большинстве примеров кодирования PHP в Интернете.

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

while хорош, когда что-то может начинаться как false, поэтому оно может предотвратить что-то из когда-либо запущенных и тратить ресурсы.

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

foreach хорош для итерации через array или object. Даже если вы можете прокручивать строку с помощью инструкции for с использованием синтаксиса массива, вы не можете использовать foreach для этого, хотя в PHP.

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