В-четвертых, я новичок в 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, количество итераций определяет время выполнения. for
. Если вы хотите запустить и остановить условие, используйте цикл while Насколько мне известно, разница в производительности между циклом 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.
Структура управления Вложенность: это действительно зависит от того, что вы делаете, чтобы определить структуру управления, которую нужно использовать при вложенности. В некоторых случаях, таких как объектно-ориентированное программирование, вы действительно хотите вызывать функции, которые содержат ваши структуры управления (индивидуально), а не использовать массивные программы в процедурном стиле, которые содержат много вложенных элементов управления. Это упростит чтение, отладка и создание экземпляра.