Domanda

Si tratta di PHP, ma non ho alcun dubbio che molte delle stesse osservazioni si applicano ad altre lingue.

Messo semplicemente, che cosa sono le differenze tra i diversi tipi di anello per PHP?È uno più veloce/migliore degli altri o devo semplicemente mettere in più leggibile loop?

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


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


do
{
    # code...
}
while ($flag == false);
È stato utile?

Soluzione

Il ciclo For e While sono entrata condizione di loop.Valutare la condizione prima, in modo che il blocco di istruzioni associato con il ciclo non eseguire anche una sola volta, se la condizione non riesce a soddisfare

Le istruzioni all'interno di questo per il blocco del ciclo verrà eseguito 10 volte, il valore di $i verrà da 0 a 9;

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

Stessa cosa fatta con il ciclo while:

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

Ciclo Do-while è uscita la condizione del ciclo.E ' garantito per eseguire una sola volta, poi si valuterà la condizione prima di ripetere il blocco

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

foreach viene utilizzato per accedere a elementi di una matrice, dall'inizio alla fine.All'inizio del ciclo foreach, il puntatore interno della matrice è situato al primo elemento dell'array, nel passo successivo è impostato per il 2 ° elemento dell'array e così via fino a che la matrice estremità.Nel blocco del ciclo Il valore di corrente elemento di matrice è disponibile come $valore e la chiave dell'elemento corrente è disponibile come $indice.

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

Si potrebbe fare la stessa cosa con un ciclo while, come questo

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
}

E infine: Il Manuale di PHP è un tuo amico :)

Altri suggerimenti

Questo è CS101, ma dal momento che nessun altro ha menzionato, mentre i loop di valutare la loro condizione prima del blocco di codice, e do-while viene valutato dopo il blocco di codice, in modo do-while sono sempre in grado di eseguire il loro codice di blocco, almeno una volta, indipendentemente dalla condizione.

@brendan:

L'articolo che hai citato è seriamente obsoleto e che le informazioni è semplicemente sbagliato.Soprattutto l'ultimo punto (uso for invece di foreach) è fuorviante e la giustificazione offerta nell'articolo non si applica più alle moderne versioni di .NET.

Mentre è vero che il IEnumerator utilizza virtuale chiamate, queste può in realtà essere sostituite da una moderna compilatore.Inoltre, .NETTO ora sa generics e fortemente tipizzato enumeratori.

Ci sono un sacco di test di performance là fuori che dimostrare in modo conclusivo che l' for è generalmente più veloce di foreach. Ecco un esempio.

Io uso il primo ciclo quando l'iterazione su un convenzionale (indicizzata?) array e il ciclo foreach quando ha a che fare con un array associativo.Sembra proprio naturale e aiuta il flusso di codice e di essere più leggibile, a mio parere.Come per do...while, io uso quelli quando devo fare di più che semplicemente sfogliare un array.

Io non sono sicuro di tutti i benefici di prestazioni, però.

La prestazione non è significativamente migliore in entrambi i casi.Mentre è utile per le attività più complesse rispetto a scorrere, ma for e while sono funzionalmente equivalenti.

Foreach è bello, ma ha un importante avvertimento:si non è possibile modificare l' enumerabile sei l'iterazione.Quindi, nessuna rimozione, aggiunta o sostituzione di voci/in esso.La modifica di voci (come cambiare le loro proprietà) è OK, ovviamente.

Con un ciclo foreach, una copia dell'array originale è stata fatta in memoria di utilizzare al suo interno.Non si deve utilizzare su strutture di grandi dimensioni;un semplice ciclo for è una scelta migliore.È possibile utilizzare un ciclo while in modo più efficiente in un grande non-numericamente indicizzati struttura come questa:

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

Ma questo approccio è particolarmente brutto per una semplice struttura di piccole dimensioni.

mentre i loop sono più adatti per scorrono in ruscelli, o, come nel seguente esempio che si vede molto spesso in PHP:

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

Quasi tutto il tempo differenti cicli sono intercambiabili, e verrà giù per a) efficienza, o b) chiarezza.

Se si conosce l'efficienza trade-off dei diversi tipi di cicli, quindi sì, per rispondere alla tua domanda iniziale:utilizzare uno che sembra più pulito.

Ogni costrutto serve uno scopo diverso.

per Questo è utilizzato per il ciclo per un determinato numero di iterazioni.

foreach, che viene utilizzato per scorrere tutti i valori in un insieme.

mentre - Questo è usato per il ciclo fino a quando si incontra una condizione.

Dei tre", mentre" sarà probabilmente fornire le migliori prestazioni nella maggior parte delle situazioni.Naturalmente, se si fare qualcosa di simile, si sono fondamentalmente riscrivere il ciclo "for" (che in c# è leggermente più performante).

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

Tutti hanno diversi scopi fondamentali, ma possono essere utilizzati anche in modo un po ' allo stesso modo.Dipende completamente sul problema specifico che si sta cercando di risolvere.

Con un ciclo foreach, una copia dell'array originale è stata fatta in memoria di utilizzare al suo interno.

Foreach è bello, ma ha un importante avvertimento:non è possibile modificare le enumerabile sei l'iterazione.

Sia di quelle non sarà un problema se si passa con riferimento, invece, di valore:

 foreach ($array as &$value) {

Penso che questo sia stato consentito dal PHP 5.

Quando si accede agli elementi di un array, per chiarezza, vorrei usare un foreach ogni volta che è possibile, e utilizzare solo una e, se necessario, i reali valori di indice (per esempio, lo stesso indice in matrici multiple).Questo riduce al minimo la possibilità per gli errori di battitura in quanto, per il loop di fare questo troppo facile.In generale, PHP potrebbe non essere il posto preoccuparsi troppo sulle prestazioni.E, ultimo ma non meno importante, e foreach hanno (o dovrebbero avere;Io non sono un PHP-er) lo stesso Big-O (O(n)), quindi forse una piccola quantità di memoria in uso o in lieve costante o lineare colpo nel tempo.

In quanto a prestazioni, un foreach è più dispendioso in termini di rispetto per

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top