PHP Foreach循环效率

时间:2010-02-27 17:38:43

标签: php arrays

我在PHP中使用foreach循环,类似于:

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

关于效率,在$attributes = $class->getAttributes();循环之外使用foreach语句并迭代$attributes变量是否更好?或者$class->getAttributes()语句只在开头的foreach声明中被调用一次?

(我知道在这种情况下这可能不是效率问题,但我想知道这个和其他更大案例的原理)

谢谢,

史蒂夫

4 个答案:

答案 0 :(得分:15)

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

这是一个证明它的例子:

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循环开始时调用一次。

答案 1 :(得分:2)

foreach在内部复制:

  

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

所以它对你的情况没有任何影响。 $class->getAttributes()只被调用一次来检索数组。

答案 2 :(得分:1)

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

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

}

更具可读性,如果需要,可以在foreach结束后获取属性。

但是,在对您的问题做出更直接的回复时,getAttributes()只会在任何一种情况下被调用一次。

答案 3 :(得分: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++);