2008-08-22 24 views
6

Es geht um PHP, aber ich habe keinen Zweifel, viele der gleichen Kommentare werden für andere Sprachen gelten.Der Unterschied zwischen den Schleifen

Einfach gesagt, was sind die Unterschiede in den verschiedenen Arten von Schleife für PHP? Ist man schneller/besser als die anderen oder sollte ich einfach die lesbarste Schleife einfügen?

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


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


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

Leistung ist sehr selten ein motivierender Faktor bei der Wahl eines Schleife. –

Antwort

10

For Schleife und While-Schleifen sind Eintrittsbedingung Schleifen. Sie werten die Bedingung zuerst aus, so dass der der Schleife zugeordnete Anweisungsblock nicht einmal ausgeführt wird, wenn die Bedingung nicht erfüllt werden kann. Die Anweisungen innerhalb dieses for-Schleifenblocks werden 10 Mal ausgeführt, der Wert von $ i ist 0 bis 9;

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

Die gleiche Sache mit while-Schleife:

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

Do-while-Schleife austritts Zustand Schleife ist.Es ist einmal auszuführen garantiert, dann wird es Bedingung bewerten, bevor der Block

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

foreach verwendet Wiederholung wird auf Array-Elemente vom Anfang bis zum Ende zugreifen. 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 zweite Element des Arrays gesetzt und so weiter, bis das Array endet. Im Schleifenblock Der Wert des aktuellen Array-Elements ist als $ value verfügbar und der Schlüssel des aktuellen Elements ist als $ index verfügbar.

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

Sie könnten das gleiche mit while-Schleife zu tun, wie diese

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 schließlich: The PHP Manual ist dein Freund :)

0

Ich benutze die erste Schleife, wenn sie über einen herkömmlichen (indexiert?) Array und das foreach Schleife iteriert, wenn sie mit einem assoziativen Array handelt. Es scheint nur natürlich und hilft meiner Meinung nach den Code fließen und lesbarer zu sein. Wie für ... while-Schleifen verwende ich diese, wenn ich mehr tun muss, als nur durch ein Array zu blättern.

Ich bin mir jedoch keiner Leistungsvorteile sicher.

0

Die Leistung ist in beiden Fällen nicht signifikant besser. Dies ist nützlich für komplexere Aufgaben als Iterieren, aber for und while sind funktional gleichwertig.

Foreach ist nett, aber hat eine wichtige Einschränkung: Sie kann nicht ändern die aufzählbare Sie Iteration sind. Also kein Entfernen, Hinzufügen oder Ersetzen von Einträgen zu/in ihm. Das Ändern von Einträgen (wie das Ändern ihrer Eigenschaften) ist natürlich in Ordnung.

0

Mit einer foreach-Schleife wird eine Kopie des ursprünglichen Arrays im internen Speicher erstellt. Sie sollten sie nicht auf großen Strukturen verwenden; Eine einfache for-Schleife ist eine bessere Wahl. Sie können eine while-Schleife effizienter auf einer großen nicht-numerisch indizierte Struktur wie folgt verwendet werden:

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

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

While-Schleifen besser geeignet sind für durch Ströme Looping, oder wie im folgenden Beispiel, die Sie sehen sehr häufig in PHP:

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

Fast alle der Zeit die verschiedenen Schleifen sind austauschbar, und es wird kommen entweder auf a) Effizienz oder b) Klarheit.

Wenn Sie die Effizienz Kompromisse der verschiedenen Arten von Schleifen kennen, dann ja, um Ihre ursprüngliche Frage zu beantworten: Verwenden Sie die, die am saubersten aussieht.

1

Das CS101 ist, aber da niemand sonst hat es erwähnt, während Schleifen ihren Zustand vor dem Codeblock zu bewerten und do-while wertet nach dem Codeblock aus, so dass do-while-Schleifen ihren Codeblock immer mindestens einmal unabhängig von der Bedingung ausführen.

0

Jedes Schleifenkonstrukt dient einem anderen Zweck.

für - Dies wird für eine bestimmte Anzahl von Iterationen verwendet.

foreach - Dies wird zum Durchlaufen aller Werte in einer Sammlung verwendet.

while - Dies wird verwendet, um eine Schleife zu bilden, bis Sie eine Bedingung erfüllen.

Von den dreien wird "while" wahrscheinlich die beste Leistung in den meisten Situationen bieten. Natürlich, wenn Sie etwas wie folgt tun, schreiben Sie im Grunde die "for" -Schleife (die in C# ist etwas performanter).

Sie alle haben unterschiedliche grundlegende Zwecke, aber sie können auch auf die gleiche Weise verwendet werden. Es hängt vollständig von dem spezifischen Problem ab, das Sie versuchen zu lösen.

1

@brendan:

Der Artikel, den Sie zitiert ist ernst veraltet und die Informationen sind einfach falsch. Vor allem der letzte Punkt (for statt foreach) ist irreführend und die Begründung in dem Artikel gilt nicht mehr für moderne Versionen von .NET.

Während es wahr ist, dass die IEnumerator virtuelle Anrufe verwendet, können diese tatsächlich durch einen modernen Compiler inline sein. Darüber hinaus kennt .NET jetzt Generika und stark typisierte Enumeratoren.

Es gibt viele Leistungstests, die eindeutig beweisen, dass for in der Regel nicht schneller als foreach ist. Here's an example.

+0

Der Link ist tot. – edigu

0

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

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

diese beiden wird kein Problem sein, wenn Sie durch Verweis statt Wert übergeben:

foreach ($array as &$value) { 

Ich denke, das 5.

0

seit PHP erlaubt ist, wenn die Elemente des Zugriffs Ein Array, aus Gründen der Übersichtlichkeit verwende ich foreach, wann immer es möglich ist, und verwende nur for, wenn du die tatsächlichen Indexwerte benötigst (zum Beispiel den gleichen Index in mehreren Arrays). Dies minimiert auch die Gefahr von Tippfehlern, da For-Schleifen das alles zu einfach machen. Im Allgemeinen ist PHP vielleicht nicht der Ort, an dem man sich über die Leistung Sorgen machen muss. Und last but not least, for und foreach haben (oder sollten; ich bin kein PHP-er) die gleiche Big-O-Zeit (O (n)), also schaust du dir evtl. eine kleine Menge mehr Speicherverbrauch an oder ein leichter konstanter oder linearer Treffer in der Zeit.

Verwandte Themen