[for
循环和 foreach
循环与范围]
我们在十万次迭代中比较了 for
循环和 foreach
循环与 range
。测试结果表明 for
循环比 foreach
循环执行得更快。
原因是 for
循环通过增加整数值来进行比较。相比之下,foreach
和 range
必须在提取每个元素并检查数组末尾之前创建一个数组。
<?php $time_one = microtime(true); for ($i=0; $i < 100000; $i++) { # code... } echo 'For loop: ' . (microtime(true) - $time_one) . ' s', PHP_EOL; echo "<br />"; $time_two = microtime(true); foreach (range(0, 100000) as $i) { # code... } echo 'Foreach + range loop: ' . (microtime(true) - $time_two) . ' s', PHP_EOL; ?>
输出:
For loop: 0.001291036605835 s Foreach + range loop: 0.00661301612854 s
[带有后缀和前缀增量的 for
循环]
如果时间差非常关键,你应该知道带有前缀增量的 for
循环比带有后缀增量的 for
循环执行得更快。
这是因为后缀在将前一个值加一之前保留了前一个值的副本,而前缀增量在不保留前一个值的副本的情况下加一。
例子:
<?php $time_one = microtime(true); for ($i=0; $i < 100000; ++$i) { # code... } echo 'For loop with prefix $i: ' . (microtime(true) - $time_one) . ' s', PHP_EOL; echo "<br />"; $time_two = microtime(true); for ($i=0; $i < 100000; $i++) { # code... } echo 'For loop with postfix $i: ' . (microtime(true) - $time_two) . ' s', PHP_EOL; ?>
输出:
For loop with prefix $i: 0.0012187957763672 s For loop with postfix $i: 0.0031270980834961 s
[带有 count
函数的 for
循环]
带有 count
函数的 for
循环比没有的执行得更快。
我们在下面的代码块中运行了两个测试,第一个测试使用了一个带有 count
函数的 for
循环,第二个测试使用了没有 count
函数的数组中元素的数量。
例子:
<?php $myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24]; $time_one = microtime(true); for ($i=0; $i < count($myArray); $i++) { # code... } echo 'For loop with count function: ' . (microtime(true) - $time_one) . ' s', PHP_EOL; echo "<br />"; $time_two = microtime(true); for ($i=0; $i < 10; $i++) { # code... } echo 'For loop without count function: ' . (microtime(true) - $time_two) . ' s', PHP_EOL; ?>
输出:
For loop with count function: 6.9141387939453E-6 s For loop without count function: 9.5367431640625E-7 s
[没有键的 foreach
和有键的 foreach
]
与带有键和值的 foreach
循环相比,没有键的 foreach
循环执行得更快。
下面的代码片段有一个由十个元素组成的数组,我们在数组上执行一个 foreach
循环。第一次执行不使用键,而第二次执行使用键和值。
例子:
<?php $myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24]; $time_one = microtime(true); foreach ($myArray as $value) { # code... } echo 'Foreach loop without key: ' . (microtime(true) - $time_one) . ' s', PHP_EOL; echo "<br />"; $t01 = microtime(true); foreach ($myArray as $key => $value) { # code... } echo 'Foreach loop with key and value: ' . (microtime(true) - $t01) . ' s', PHP_EOL; ?>
输出:
Foreach loop without key: 0.00055599212646484 s Foreach loop with key and value: 9.5367431640625E-7 s
[带有 count
函数的 for
循环和带有键和值的 foreach
]
在 foreach
(带有键和值)和 for
之间使用 count
函数对包含十个元素的数组进行测试表明,带有键和值的 foreach
比带有计数功能。
例子:
<?php $myArray = [1, 4, 6, 8, 11, 14, 16, 18, 21, 24]; $time_one = microtime(true); for ($i=0; $i < count($myArray); $i++) { # code... } echo 'For loop with count: ' . (microtime(true) - $time_one) . ' s', PHP_EOL; echo "<br />"; $time_two = microtime(true); foreach ($myArray as $key => $value) { # code... } echo 'Foreach loop with key and value: ' . (microtime(true) - $time_two) . ' s', PHP_EOL; ?>
输出:
For loop with count: 8.1062316894531E-6 s Foreach loop with key and value: 2.1457672119141E-6 s
请注意,当你在 Web 浏览器中运行代码示例时,你会得到不同的时间结果。我们在 Windows 10 上使用 PHP 8.1.2 执行了上述所有代码示例。
[for
循环和 foreach
循环的可读性]
在可读性方面,你会发现 for
循环比 foreach
循环具有更好的可读性。这是因为,对于 for
循环,你会知道你正在比较一个小于较大数字的计数器。
当使用带有 range 的 foreach
时,你必须在 foreach
循环中推断 range
函数的目的