Reputation: 25765
I am using a foreach
loop within PHP similar to this:
foreach ($class->getAttributes() as $attribute) {
// Work
}
Concerning efficiency, is it better to have a $attributes = $class->getAttributes();
statement outside the foreach
loop and iterate over the $attributes
variable? Or is the $class->getAttributes()
statement only getting called once inside the foreach
declaration at the beginning?
(I realize this might not be a big efficiency concern in this case, but I would like to know the principle for this and other larger cases)
Thanks,
Steve
Upvotes: 5
Views: 956
Reputation: 39356
As others have said, the function in your example is only called once.
The case in which pre-evaluating can make a difference is for loops.
$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++);
Upvotes: 1
Reputation: 400932
Using $class->getAttributes()
outside of the foreach
loop and using a temporary variable, or keeping it like you wrote should not change anything about performances : it will still be evaluated only once.
And here is an example that proves it :
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 />";
}
I am using a function and not a method of a class, to get a shorter example, but the principle would be the same with a class+method.
And calling this portion of code gives the following output :
function called !
first : 123
second : 456
last : 789
i.e. the get_array()
function is only called once, at the beginning of the foreach
loop.
Upvotes: 15
Reputation: 655189
foreach
operates on a copy internally:
Note: Unless the array is referenced,
foreach
operates on a copy of the specified array and not the array itself. […]
So it doesn’t make any difference in your case. $class->getAttributes()
is only called once to retrieve the array.
Upvotes: 2
Reputation: 61557
I haven't tested, but I'd think that doing something like this:
$attributes = $class->getAttributes();
foreach($attributes as $attribute)
{
}
Is more readable, and you can get to the attributes after the foreach has conclude if you need to.
However, in a more direct response to your question, getAttributes()
will only be called once in either case.
Upvotes: 1