for loop vs while loop vs foreach loop PHP

В-четвертых, я новичок в 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. Надеюсь, кто-то поможет мне выяснить, какой цикл лучше использовать.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проверьте 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 позволяет вычислить этот оператор для каждого цикла. Вычисление значения сначала, а затем с использованием вычисления в цикле делает его запускать только один раз.

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

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

Производительность: достаточно просто, чтобы протестировать. Если вы делаете что-то вроде машинного обучения или больших данных, вы должны действительно смотреть на что-то, что собрано или собрано и не интерпретировано ; если циклы действительно имеют значение. Вот некоторые ориентиры между различными языками программирования. Похоже, do-while цикл do-while 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); в $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); в $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 быстрее, чем в моих тестах, но в основном недоиспользуется в большинстве примеров PHP-кодирования в Интернете.

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

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

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

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

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