改进 PHP 'for' 循环
Posted
技术标签:
【中文标题】改进 PHP \'for\' 循环【英文标题】:Improve PHP 'for' loop [duplicate]改进 PHP 'for' 循环 【发布时间】:2016-05-09 15:49:21 【问题描述】:当使用典型的for
循环时,phpStorm 建议更改它以获得更好的性能。我真的不明白这个建议。应该怎么改?
【问题讨论】:
点击 more 时 PHPStorm 的建议是什么?我很好奇为什么 PHPStorm 建议这样做。 只有analyses for loops and reports the usage blablabla
:)
foreach
然后忘记
【参考方案1】:
如果您在for
循环内执行count()
,则每次迭代都会执行它,调用该函数会产生性能开销。
如果您在for
循环之前调用count()
并将结果分配给一个变量,然后与for
循环中的变量进行比较,您就没有函数调用开销,所以它更快
【讨论】:
【参考方案2】:for($i = 0; $i <= count($data); $i++)
在此示例中,每次迭代都必须再次count($data)
。
for($i = 0, $iMax = count($data); $i <= $iMax; $i++)
在这个例子中,它只需要count($data)
一次。
这就是区别。
【讨论】:
参考见this post 大概这是假设$data
在循环内没有改变长度,否则两者会不同。
@abligh 如果$data
在for 循环内改变长度,你可能一开始就不应该使用for 循环。不过我可能有偏见,我认为你不应该使用 for 循环。
$iMax
是一个非常糟糕的变量名称。它应该是$length
或更易读的东西。此外,使用foreach($array as $i => &$value)
将产生相同的结果,并且实际上可以与for()
循环一样快。
@Odalrick for
循环有其用途。然而,在 OP 的情况下,看一眼变量名称就表明 foreach
可能 是一个更好的主意。无论如何,我经常强烈支持foreach
,因为它不关心其中有间隙的数组/结构,而且(IMO)看起来有点干净。【参考方案3】:
通过以您的方式进行循环,每次迭代都需要评估count($data)
。如果列表中有很多项目,则可能需要一段时间(相对)来计算这些项目,并且每次都必须这样做。
它给你的提示是在开始时将一个变量设置为 count($data) 的值,然后将该变量用作循环限制,当它只计算一次时。
这可以通过两种方式完成:
$loopMax = count($data);
for ($i = 0; $i <= $loopMax; $i++)
// Your code here
或者
for ($i=0, $loopMax = count($data); $i <= $loopMax; $i++)
// your code here
【讨论】:
如果您出于某种原因要进行多次迭代,显然首选第一个。在其他时候,底部是首选,因为您应该始终努力限制变量的范围。 top 的使用不限于当您要对其进行多次迭代时,例如,如果应用程序需要输出计数,它也会很有用;也许是一些分页或类似的。但是是的,变量的范围应该限制在需要的地方。以上是关于改进 PHP 'for' 循环的主要内容,如果未能解决你的问题,请参考以下文章