2010-02-27 19 views
5

Ich verwende eine foreach Schleife in PHP ähnlich wie diese:PHP Foreach-Schleifen-Efficiency

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

Effizienz angeht, so ist es besser, eine $attributes = $class->getAttributes(); Anweisung außerhalb der foreach Schleife zu haben und über die $attributes Variable laufen? Oder wird die Anweisung nur einmal innerhalb der foreach Erklärung am Anfang aufgerufen?

(Ich weiß, das ist kein große Effizienz Sorge in diesem Fall sein könnte, aber ich möchte das Prinzip für diese und andere größere Fälle kennen)

Danke,

Steve

Antwort

15

Verwenden $class->getAttributes() außerhalb der foreach Schleife und mit einer temporären Variable, oder halten Sie es wie Sie geschrieben sollte nichts an den Leistungen ändern: es wird immer noch nur einmal ausgewertet.

Und hier ist ein Beispiel, das es beweist:

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 />"; 
} 

Ich verwende eine Funktion und kein Verfahren einer Klasse, bekommt ein kürzeres Beispiel, aber das Prinzip wäre das gleiche, mit einer Klasse + Methode.


Und um diesen Teil des Codes Aufruf gibt die folgende Ausgabe:

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

das heißt die get_array() Funktion nur einmal, am Anfang der Schleife foreach genannt wird.

1

habe ich nicht getestet, aber ich würde denken, dass so etwas wie dies zu tun:

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

} 

mehr lesbar ist, und Sie können auf die Attribute erhalten, nachdem die foreach schließen hat, wenn Sie benötigen.

In einer direkteren Antwort auf Ihre Frage wird jedoch getAttributes() in beiden Fällen nur einmal aufgerufen.

+0

+1 für die Bequemlichkeit des Zugriffs auf $ -Attribute außerhalb der Schleife. – thetaiko

2

foreach arbeitet auf einer Kopie intern:

Hinweis: Es sei denn, das Array referenziert wird, arbeitet foreach auf einer Kopie des angegebenen Arrays und nicht das Array selbst. [...]

So macht es in Ihrem Fall keinen Unterschied. $class->getAttributes() wird nur einmal aufgerufen, um das Array abzurufen.

1

Wie bereits erwähnt, wird die Funktion in Ihrem Beispiel nur einmal aufgerufen.

Der Fall, in dem die Vorbewertung einen Unterschied machen kann, ist 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++);