Frage

Es geht um PHP, aber ich habe keinen Zweifel, dass viele der gleichen Kommentare auch für andere Sprachen gelten werden.

Einfach ausgedrückt: Was sind die Unterschiede zwischen den verschiedenen Schleifentypen für PHP?Ist einer schneller/besser als die anderen oder sollte ich einfach die am besten lesbare Schleife einfügen?

for ($i = 0; $i < 10; $i++)
{
    # code...
}


foreach ($array as $index => $value)
{
    # code...
}


do
{
    # code...
}
while ($flag == false);
War es hilfreich?

Lösung

For-Schleifen und While-Schleifen sind Eingangsbedingungsschleifen.Sie werten zuerst die Bedingung aus, sodass der mit der Schleife verknüpfte Anweisungsblock kein einziges Mal ausgeführt wird, wenn die Bedingung nicht erfüllt ist

Die Anweisungen in diesem for-Schleifenblock werden zehnmal ausgeführt, der Wert von $i liegt zwischen 0 und 9;

for ($i = 0; $i < 10; $i++)
{
        # code...
}

Das Gleiche wird mit der while-Schleife gemacht:

$i = 0;
while ($i < 10)
{
    # code...
    $i++
}

Die Do-while-Schleife ist eine Exit-Bedingungsschleife.Es ist garantiert, dass er einmal ausgeführt wird, dann wird die Bedingung ausgewertet, bevor der Block wiederholt wird

do
{
        # code...
}
while ($flag == false);

foreach wird verwendet, um von Anfang bis Ende auf Array-Elemente zuzugreifen.Zu Beginn der foreach-Schleife wird der interne Zeiger des Arrays auf das erste Element des Arrays gesetzt, im nächsten Schritt wird er auf das 2. Element des Arrays gesetzt und so weiter, bis das Array endet.Im Schleifenblock ist der Wert des aktuellen Array-Elements als $value und der Schlüssel des aktuellen Elements als $index verfügbar.

foreach ($array as $index => $value)
{
        # code...
}

Das Gleiche könnten Sie auch mit der while-Schleife machen, etwa so

while (current($array))
{
    $index = key($array);  // to get key of the current element
    $value = $array[$index]; // to get value of current element

    # code ...  

    next($array);   // advance the internal array pointer of $array
}

Und zuletzt: Das PHP-Handbuch ist dein Freund :)

Andere Tipps

Dies ist CS101, aber da es noch niemand erwähnt hat, bewerten while-Schleifen ihren Zustand vor dem Codeblock und do-while nach dem Codeblock, sodass bei do-while-Schleifen immer garantiert ist, dass sie ihren Codeblock mindestens einmal ausführen. unabhängig vom Zustand.

@brendan:

Der von Ihnen zitierte Artikel ist stark veraltet und die Informationen sind einfach falsch.Besonders der letzte Punkt (use for anstatt foreach) ist irreführend und die im Artikel angebotene Begründung gilt nicht mehr für moderne Versionen von .NET.

Es stimmt zwar, dass die IEnumerator nutzt virtuelle Anrufe, diese dürfen tatsächlich von einem modernen Compiler eingebunden werden.Darüber hinaus kennt .NET jetzt Generics und stark typisierte Enumeratoren.

Es gibt viele Leistungstests, die das schlüssig beweisen for ist im Allgemeinen nicht schneller als foreach. Hier ist ein Beispiel.

Ich verwende die erste Schleife, wenn ich über ein herkömmliches (indiziertes?) Array iteriere, und die foreach-Schleife, wenn ich mit einem assoziativen Array arbeite.Es wirkt einfach natürlich und trägt meiner Meinung nach dazu bei, dass der Code fließt und besser lesbar ist.Was do...while-Schleifen betrifft, verwende ich diese, wenn ich mehr tun muss, als nur ein Array durchzublättern.

Ich bin mir jedoch nicht sicher, ob es Leistungsvorteile gibt.

Die Leistung ist in beiden Fällen nicht wesentlich besser.While ist für komplexere Aufgaben als das Iterieren nützlich, aber for Und while sind funktional gleichwertig.

Foreach ist nett, hat aber einen wichtigen Vorbehalt:Du Kann nicht geändert werden die Aufzählung, die Sie iterieren.Es ist also kein Entfernen, Hinzufügen oder Ersetzen von Einträgen erforderlich.Das Ändern von Einträgen (z. B. das Ändern ihrer Eigenschaften) ist natürlich in Ordnung.

Mit einer foreach-Schleife wird eine Kopie des ursprünglichen Arrays im Speicher erstellt, um sie darin zu verwenden.Sie sollten sie nicht bei großen Bauwerken verwenden;Eine einfache for-Schleife ist die bessere Wahl.Sie können eine While-Schleife effizienter für eine große, nicht numerisch indizierte Struktur wie diese verwenden:

while(list($key, $value) = each($array)) {

Aber dieser Ansatz ist für eine einfache kleine Struktur besonders hässlich.

while-Schleifen eignen sich besser zum Durchlaufen von Streams oder wie im folgenden Beispiel, das man in PHP sehr häufig sieht:

while ($row = mysql_fetch_array($result)) {

Fast immer sind die verschiedenen Schleifen austauschbar, und es kommt entweder auf a) Effizienz oder b) Klarheit an.

Wenn Sie die Effizienzkompromisse der verschiedenen Schleifentypen kennen, dann ja, um Ihre ursprüngliche Frage zu beantworten:Verwenden Sie diejenige, die am saubersten aussieht.

Jedes Schleifenkonstrukt dient einem anderen Zweck.

for – Dies wird verwendet, um eine Schleife für eine bestimmte Anzahl von Iterationen durchzuführen.

foreach – Dies wird verwendet, um alle Werte in einer Sammlung zu durchlaufen.

while – Dies wird für eine Schleife verwendet, bis Sie eine Bedingung erfüllen.

Von den dreien wird „while“ in den meisten Situationen höchstwahrscheinlich die beste Leistung erbringen.Wenn Sie so etwas wie das Folgende tun, schreiben Sie natürlich im Grunde die „for“-Schleife neu (die in c# etwas leistungsfähiger ist).

$count = 0;
do
{
   ...
   $count++;
}
while ($count < 10);  

Sie haben alle unterschiedliche grundlegende Zwecke, können aber auch in etwa auf die gleiche Weise verwendet werden.Es hängt ganz von dem spezifischen Problem ab, das Sie lösen möchten.

Mit einer foreach-Schleife wird eine Kopie des ursprünglichen Arrays im Speicher erstellt, um sie darin zu verwenden.

Foreach ist nett, hat aber eine wichtige Einschränkung:Sie können die Aufzählung, die Sie iterieren, nicht ändern.

Beides stellt kein Problem dar, wenn Sie eine Referenz anstelle eines Werts übergeben:

 foreach ($array as &$value) {

Ich denke, das ist seit PHP 5 erlaubt.

Wenn ich auf die Elemente eines Arrays zugreife, würde ich der Übersichtlichkeit halber wann immer möglich ein foreach verwenden und nur dann ein for verwenden, wenn Sie die tatsächlichen Indexwerte benötigen (z. B. den gleichen Index in mehreren Arrays).Dies minimiert auch das Risiko von Tippfehlern, da For-Schleifen dies allzu einfach machen.Im Allgemeinen ist PHP möglicherweise nicht der Ort, an dem man sich allzu viele Gedanken über die Leistung machen sollte.Und zu guter Letzt: for und foreach have (oder hätte haben sollen);Ich bin kein PHP-Kenner) und die gleiche Big-O-Zeit (O(n)), sodass Sie möglicherweise mit einer geringfügig höheren Speichernutzung oder einem leichten konstanten oder linearen Zeittreffer rechnen.

Im Hinblick auf die Leistung ist ein foreach aufwändiger als ein for

http://forums.asp.net/p/1041090/1457897.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top