Цикл for против цикла while и цикла foreach PHP
Во-первых, я новичок в PHP. Я использовал для цикла, в то время как цикл, цикл 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. Надеюсь, кто-нибудь поможет мне выяснить, какой цикл лучше использовать.
6 ответов
какой из них лучше для производительности?
Это не важно
по каким критериям выбрать петлю?
Если вам просто нужно пройтись по всем элементам объекта или массива, используйте foreach
, Случаи, где вам нужно for
включают
- Когда вам явно нужно сделать что-то с числовым индексом, например:
- когда вам нужно использовать предыдущие или следующие элементы из итерации
- когда вам нужно изменить счетчик во время итерации
foreach
гораздо удобнее, потому что не требует настройки подсчета и может проходить через любой элемент - будь то свойства объекта или элементы ассоциативного массива (for
не поймаю). Обычно это лучше для удобства чтения.
что следует использовать, когда мы зациклимся внутри другого цикла?
Оба в порядке; в вашем демонстрационном случае, foreach
это самый простой путь.
какой из них лучше для производительности?
Какая разница? Это не будет значительным. Когда-либо. Если бы такие крошечные оптимизации имели значение, вы бы не использовали PHP.
по каким критериям выбрать петлю?
Выберите тот, который легче всего читать и который может вызвать ошибки в будущем. Когда вы просматриваете целые числа, for
петли отличные. Когда вы просматриваете коллекцию как массив, foreach
отлично, когда вам просто нужно зациклить, пока вы не "сделали", while
отлично.
Это также может зависеть от стилистических правил (например, в Python вы почти всегда хотите использовать цикл foreach, потому что это "так, как это делается в Python"). Я не уверен, что стандарт в PHP, хотя.
что следует использовать, когда мы зациклимся внутри другого цикла?
Какой бы тип цикла не имел смысла (см. Ответ выше).
В вашем коде for
цикл кажется мне вполне естественным, так как у вас есть определенный индекс начала и конца.
Проверьте http://www.phpbench.com/ для хорошей справки о некоторых тестах PHP.
Цикл for обычно довольно быстрый. Не включайте ваш счетчик ($row) или count($all) в сам по себе, сделайте это снаружи так:
$count_all = count($all);
for($i=0;$i<$count_all;$i++)
{
// Code here
}
Помещение счетчика ($ all) в цикл for позволяет рассчитать этот оператор для каждого цикла. Сначала вычисление значения, а затем использование вычисления в цикле заставляет его выполняться только один раз.
- Для производительности не имеет значения, если вы выбираете
for
илиwhile
цикл, количество итераций определяет время выполнения. - Если вы знаете число итераций заранее, выберите
for
петля. Если вы хотите запустить и остановиться на условии, используйтеwhile
петля
Производительность: достаточно легко проверить. Если вы занимаетесь чем-то вроде машинного обучения или больших данных, вам следует взглянуть на что-то, что скомпилировано или собрано и не интерпретируется; если циклы действительно имеют значение. Вот некоторые тесты между различными языками программирования. Это выглядит как 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. делай быстрее чем while
в моих тестах, но в значительной степени недостаточно используется в большинстве примеров PHP-кодирования в Интернете.
for
контролируется счетчиком, поэтому он повторяется определенное количество раз; хотя это медленнее в моих собственных результатах, чем с помощью while
за то же самое.
while
хорошо, когда что-то может начаться как false
, так что это может предотвратить что-то от запуска и траты ресурсов.
do-while
хотя бы один раз, а потом, пока условие не вернется false
, Это немного быстрее, чем while
Цикл в моих результатах, но он будет запущен хотя бы один раз.
foreach
хорошо для перебора array
или же object
, Даже если вы можете перебрать строку с for
заявление с использованием синтаксиса массива, вы не можете использовать foreach, чтобы сделать это, хотя в PHP.
Вложенность структуры управления: это действительно зависит от того, что вы делаете, чтобы определить, когда структуру управления использовать при вложении. В некоторых случаях, таких как объектно-ориентированное программирование, вы на самом деле захотите вызывать функции, которые содержат ваши структуры управления (индивидуально), а не использовать массивные программы в процедурном стиле, которые содержат много вложенных элементов управления. Это может облегчить чтение, отладку и создание экземпляров.
- цикл for более уместен, если вы заранее знаете, сколько итераций нужно выполнить
- Цикл while используется в противоположном случае (когда вы не знаете, сколько нужно итераций)
- Цикл For-Each лучше всего, когда вам приходится перебирать коллекции.
Насколько я знаю, между циклом while и for практически нет разницы в производительности, я не знаю про цикл for-each