PHP Foreach循环效率

5

我正在使用类似于以下PHP代码的foreach循环:

foreach ($class->getAttributes() as $attribute) {
// Work
}

关于效率问题,是将$attributes = $class->getAttributes();语句放在foreach循环外,并遍历$attributes变量更好呢?还是$class->getAttributes()语句只在foreach循环声明时调用一次?(我意识到这在这种情况下可能不是一个大的效率问题,但我想知道这个原则以及其他更大的情况)谢谢,Steve
4个回答

15

foreach循环之外使用$class->getAttributes()并使用临时变量,或者像您所写的一样保留它不会改变性能方面的任何内容:它仍然只会被评估一次

以下是一个证明它的例子:

function get_array() {
    echo 'function called !<br />';
    return array(
        'first' => 123,
        'second' => 456,
        'last' => 789, 
    );
}
foreach (get_array() as $key => $value) {
    echo "$key : $value<br />";
}

我正在使用一个函数而不是一个类的方法,为了得到一个更简短的示例,但原则上使用类+方法也是一样的。


调用这部分代码会产生以下输出:

function called !
first : 123
second : 456
last : 789

get_array()函数仅在foreach循环的开头调用一次。


2

foreach 在内部操作的是数组的副本:

注意:除非引用了该数组,否则 foreach 操作的是指定数组的副本而不是数组本身。[...]

因此,在您的情况下没有任何区别。$class->getAttributes() 仅被调用一次以检索该数组。


1

我还没有测试过,但我认为做这样的事情:

$attributes = $class->getAttributes();
foreach($attributes as $attribute)
{

}

更易读,并且如果需要,您可以在foreach结束后访问属性。

然而,更直接地回答您的问题,getAttributes()在任一情况下只会被调用一次。


在循环外部访问$attributes变量更加方便,加个+1 - thetaiko

1

正如其他人所说,你的示例中的函数只被调用了一次。

预先评估可以在循环中发挥作用。

$str = 'abcdefghijklmnop';

//strlen will be called on every iteration
for($i = 0; $i < strlen($str); $i++);

//strlen will only be called once
$len = strlen($str);
for($i = 0; $i < $len; $i++);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接