for循环vs while循环vs foreach循环PHP
首先,我是PHP新手。我一直在脚本中使用for循环、while循环、foreach循环。我想知道for循环vs while循环vs foreach循环PHP,php,performance,loops,nested-loops,control-structure,Php,Performance,Loops,Nested Loops,Control Structure,首先,我是PHP新手。我一直在脚本中使用for循环、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 } } $i=0;$i的 哪一个
- 哪一个性能更好
- 选择循环的标准是什么
- 当我们在另一个循环中循环时,应该使用哪个
for($i=0;$i<count($all);$i++)
{
//do some tasks here
for($j=0;$j<count($rows);$j++)
{
//do some other tasks here
}
}
$i=0;$i的
哪一个性能更好
没关系
选择循环的标准是什么
如果只需要遍历对象或数组的所有元素,请使用foreach
。需要for
的情况包括
- 当您明确需要处理数字索引时,例如:
- 当您需要在迭代中使用上一个或下一个元素时
- 在迭代过程中需要更改计数器时
foreach
更为方便,因为它不需要您设置计数,并且可以通过任何类型的成员进行计算-无论是对象属性还是关联数组元素(for
的不会捕捉到这些元素)。通常,它的可读性最好
当我们在另一个循环中循环时,应该使用哪个
两者都很好;在您的演示案例中,foreach
是最简单的方法
哪一个性能更好
谁在乎呢?这不会有什么意义。永远不会。如果这些微小的优化很重要,你就不会使用PHP了
选择循环的标准是什么
选择一个最容易阅读且将来最不可能导致错误的。当你在整数中循环时,for
循环非常好。当你在像数组一样的集合中循环时,foreach
非常好,当你只需要循环直到“完成”时,while
非常好
这也可能取决于风格规则(例如,在Python中,您几乎总是希望使用foreach循环,因为这是“在Python中完成的方式”)。不过,我不确定PHP中的标准是什么
当我们在另一个循环中循环时,应该使用哪个
无论哪种循环类型最有意义(参见上面的答案)
在您的代码中,我觉得for
循环非常自然,因为您有一个定义的开始和停止索引。
- 对于性能而言,无论是为
选择一个,还是在
循环时选择一个,迭代次数都决定执行时间
如果您知道正手时的迭代次数,请为
循环选择一个。如果您想在某个条件下运行并停止,请使用while
循环
检查一些PHP基准测试的良好参考
for循环通常非常快。不要将count($rows)或count($all)包含在for循环中,在for循环外部执行,就像这样:
$count_all = count($all);
for($i=0;$i<$count_all;$i++)
{
// Code here
}
$count\u all=count($all);
对于($i=0;$i
- 当您提前知道有多少时,for循环更合适
要执行的迭代
- While循环用于相反的情况(当您不知道有多少
(需要迭代)
- 当您必须迭代集合时,For Each循环是最好的
就我所知,while循环和for循环之间的性能差别很小,甚至没有。我不知道for-each循环的性能:
很容易测试。如果你在做机器学习或大数据之类的事情,你应该真正看看那些经过编译或组装而不是解释的东西;如果周期真的很重要的话。看起来像是do,而loop在我使用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);
“.PHP_EOL;
}
echo“执行时间:$total”。PHP\u EOL;
}
}
结果($数组);
标准:,和是大多数人在PHP中使用的主要控制结构。在我的测试中比和更快,但在web上的大多数PHP编码示例中基本上没有得到充分利用
for
是计数控制的,因此它会迭代特定的次数;尽管在我自己的结果中,它比使用while
进行相同的操作要慢
while
在某些东西可能以false开始时是好的,因此它可以防止某些东西运行和浪费资源
while
至少执行一次,然后直到条件返回false
。这比我的结果中的while
循环快一点,但它将至少运行一次
foreach
适用于迭代数组
或对象
。即使可以使用数组语法使用for
语句循环字符串,也不能在PHP中使用foreach
控件结构嵌套:这实际上取决于您在嵌套时如何确定要使用的控件结构。在某些情况下,如面向对象编程,您实际上希望调用包含控件结构的函数(单独)而不是使用包含许多嵌套控件的过程式大型程序。这可以使其更易于阅读、调试和实例化。这与性能无关。从风格上讲,增量for
循环很少用于在PHP中迭代数组。foreach
通常用于替代,因为它可以提供循环中的数组键和值。使用普通数组的循环的是(奇怪的)比foreach
迭代快一点,但这并不是使用它的好理由。它更难阅读,也不允许我们用任何可遍历数组来代替普通数组。@Francis是的。此外,即使在10k元素上运行,性能差异也只有微秒(请参阅Jason的PHPBench链接).差别真的完全没有意义。foreach循环实际上在我体内创建了变量的副本