在foreach循环中使用数组变量之前声明数组变量之间的速度是否存在差异?
e.g。
$variable = [1, 2, 3];
foreach ($variable as $value) {}
VS
foreach ([1, 2, 3] as $value) {}
答案 0 :(得分:3)
我做了一个小实验
function measure($time, $func)
{
$before = microtime(true);
for($i = 0; $i < $time; $i++) $func();
$after = microtime(true);
return $after - $before;
}
var_dump(measure(10000000, function() {
$variable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
foreach ($variable as $value) {}
})); // 7.677169084549
var_dump(measure(10000000, function() {
foreach ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as $value) {}
})); // 6.7569959163666
速度没有太大差别。
答案 1 :(得分:1)
PHP创建副本或缓存数组,因此例如这样做可以暴露此行为
$array = array("1" => "PHP code tester Sandbox Online",
"foo" => "bar", 5 , 5 => 89009,
"case" => "Random Stuff: " . rand(100,999),
"PHP Version" => phpversion()
);
foreach( $array as $key => $value ){
echo "Key: $key\n";
if($key == "1") unset($array["case"]);
}
print_r($array);
输出:
Key: 1
Key: foo
Key: 2
Key: 5
Key: case //<-- what is this doing here
Key: PHP Version
Array
(
[1] => PHP code tester Sandbox Online
[foo] => bar
[2] => 5
[5] => 89009
[PHP Version] => 5.6.18
)
现在我们在这里看到的是索引1,我们取消了键case
,实际上它不在数组的输出中,但是,我们仍然可以循环该项。现在,如果您通过引用用
foreach( $array as $key => &$value ){
///...
这消失了
Key: 1
Key: foo
Key: 2
Key: 5
Key: PHP Version
Array
(
[1] => PHP code tester Sandbox Online
[foo] => bar
[2] => 5
[5] => 89009
[PHP Version] => 5.6.18
)
您可以在此sandbox
中试用所以我们从中学到的是,在第一个例子中,PHP已经在内部复制或缓存了数组数据,所以当我们改变它的结构时,foreach并没有意识到这一点。因此,您唯一的额外成本是原始数组的变量赋值。因此,如果您在foreach,变量或方法中创建数组并不重要,因为与在foreach中创建数组相比,这样做的成本非常小。
在foreach中创建它或在foreach中调用方法时,没有额外的每个循环赋值(当我想到它时,这更有意义,然后当我说出来时)。基本上它与你调用for($i=0; $i < count($b); $i++)
时的情况不同,在这种情况下,count
将在每次迭代时完成。