Sven Rautenberg: each() und foreach() Gebrauch

Beitrag lesen

Moin!

Du argumentierst ergebnisorientiert. :)

Sven, Du argumentierst dagegen unsachlich und fragwürdig. >:(((

Gut, das mag so ankommen, aber die Tatsachen geben mir doch recht: Die while-list-each-Konstruktion stammt aus Zeiten von PHP 3 und stellt heutzutage keine Alternative zu foreach dar.

Und das vor allem deshalb, weil man allzu leicht die Randbedingungen übersieht, die man beim Einsatz von while-list-each einzuhalten hat: Den Aufruf von reset() vor Beginn der Schleife, um den Arrayzeiger, der von each() jeweils weitergestellt wird, ordnungsgemäß auf den Arrayanfang zu setzen.

Tom ist hier Recht zu geben, denn sein Konstrukt arbeitet auf einem Linux mit PHP CLI 5.3.0-dev VM GOTO durchschnittlich 12mal schneller:

Gut, dass du deinen Benchmark-Code angegeben hast. Denn er ist fehlerhaft, weil er kein reset() vor dem While macht, und somit die Schleife nur beim ersten Mal das gesamte Array durchläuft, danach nur noch mit dem hinterletzten (also dem Nicht-Element hinter dem letzten Element) arbeitet.

Wenn ich die Schleife so korrigiere:

for($i=0;$i<$u;$i++){  
        reset ($array);  
        while (list($key, $value) = each($array)){  
                $b=$key.$value;  
        }  
}  

dann kommt bei mir als Ergebnis raus, dass foreach dreimal SCHNELLER ist als while-list-each:

foreach            : 22.8057589531
while              : 62.5935459137
Durchlaeufe        : 100000

Ausgeführt auf einer lahmen Kiste mit PHP Version => 5.2.10-pl0-gentoo

Insofern ist meine durch die Kritik am "Alten" implizierte Aufforderung, while-list-each nicht mehr anzuwenden, durchaus auch aus Performancesicht begründet.

Abgesehen davon zu deinem Code konkret: Wenn du schon PHP 5 benutzt, warum machst du dir den bool-Parameter von microtime() nicht zunutze, um direkt eine float-Zahl als Uhrzeit zu erhalten? Spart dir viel Aufwand, die Laufzeitdifferenz zu berechnen.

Trink 'nen Kaffee und überleg nochmal.

...rufe ich Dir dann mal zu und schließe mit Nietzsche (Menschliches, Allzumenschliches - 1. Band, 1. Hauptstück):

Schlechte Gewohnheiten im Schließen.

Die gewöhnlichsten Irrschlüsse der Menschen sind diese:
   Eine Sache existiert, also hat sie ein Recht. Hier wird aus der Lebensfähigkeit
   auf die Zweckmäßigkeit, aus der Zweckmäßigkeit auf die Rechtmäßigkeit geschlos-
   sen. Sodann:
   Eine Meinung beglückt, also ist sie die wahre, ihre Wirkung ist gut, also ist
   sie selber gut und wahr. Hier legt man der Wirkung das Prädikat beglückend, gut,
   im Sinne des Nützlichen, bei und versieht nun die Ursache mit demselben Prädikat
   gut, aber hier im Sinne des Logisch-Gültigen. Die Umkehrung der Sätze lautet:
   Eine Sache kann sich nicht durchsetzen, erhalten, also ist sie unrecht; eine
   Meinung quält, regt auf, also ist sie falsch. Der Freigeist, der das Fehlerhafte
   dieser Art zu schließen nur allzu häufig kennen lernt und an ihren Folgen zu
   leiden hat, unterliegt oft der Verführung, die entgegengesetzten Schlüsse zu ma-
   chen, welche im allgemeinen natürlich ebensosehr Irrschlüsse sind:
   Eine Sache kann sich nicht durchsetzen, also ist sie gut; eine Meinung macht Not,
   beunruhigt, also ist sie wahr.

So viel Text für so viel Argumentation, die durch einen dummen Fehler total daneben geht? Ich nehme es dir nicht übel, wie ich es auch sonst niemandem übel nehmen kann, wenn er meine Argumente und Belege hinterfragt und mich dazu bringt, dass ich mir nie zu sicher sein sollte.

Umso größer die Freude, trotzdem richtig zu liegen. :)

- Sven Rautenberg