在foreach之前声明数组变量

时间:2018-02-16 04:52:43

标签: php loops foreach

在foreach循环中使用数组变量之前声明数组变量之间的速度是否存在差异?

e.g。

$variable = [1, 2, 3];

foreach ($variable as $value) {}

VS

foreach ([1, 2, 3] as $value) {}

2 个答案:

答案 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将在每次迭代时完成。