2012-10-11 28 views
13

1st off Sono nuovo di PHP. Ho usato per ciclo, while loop, foreach loop negli script. Mi chiedoper loop vs while loop vs ciclo foreach PHP

  • quale è meglio per le prestazioni?
  • qual è il criterio per selezionare un ciclo?
  • che dovrebbe essere utilizzato quando effettuiamo il ciclo all'interno di un altro ciclo?

il codice su cui sono bloccato chiedendomi quale ciclo utilizzare.

for($i=0;$i<count($all);$i++) 
{ 
//do some tasks here 
for($j=0;$j<count($rows);$j++) 
{ 
    //do some other tasks here 
} 
} 

È abbastanza ovvio che posso scrivere il codice precedente utilizzando while. Spero che qualcuno mi aiuti a capire quale anello dovrebbe essere meglio da usare.

+7

Non importa per le prestazioni. –

+4

Stilisticamente, i cicli 'for' incrementali sono usati molto raramente per iterare gli array in PHP. 'foreach' viene in genere utilizzato poiché può fornire sia la chiave dell'array che il valore all'interno del ciclo. –

risposta

23

quale è migliore per le prestazioni?

Non importa.

qual è il criterio per selezionare un ciclo?

Se è sufficiente scorrere tutti gli elementi di un oggetto o di un array, utilizzare foreach. I casi in cui si bisognofor includono

  • Quando si esplicitamente bisogno di fare le cose con l'indice numerico, ad esempio:
  • quando è necessario utilizzare gli elementi precedenti o successivi all'interno di un'iterazione
  • quando si necessario modificare il contatore durante un'iterazione

foreach è molto più conveniente perché non richiede di impostare il conteggio, e può lavorare sua strada attraverso qualsiasi ki nd del membro - si tratti di proprietà dell'oggetto o di elementi associativi dell'array (che non verrà catturato da for). Di solito è meglio per la leggibilità.

che deve essere utilizzato quando eseguiamo il ciclo all'interno di un altro ciclo?

Entrambi vanno bene; nel tuo caso demo, foreach è il modo più semplice per andare.

+0

Un ciclo 'for' con un array normale è (stranamente) un po 'più veloce dell'iterazione' foreach', ma non è una buona ragione per usarlo. È molto più difficile da leggere e non ci consente di sostituire alcun Traversable al posto di un array normale. –

+1

@Francis si. Inoltre, la differenza di prestazioni è in * microsecondi * anche se eseguita su elementi 10k (vedi il link PHPBench di Jason). La differenza è davvero completamente priva di significato. –

+2

beh, il ciclo foreach crea effettivamente una copia della variabile in memoria per iterarlo attraverso di essa, mentre stai direttamente iterando la variabile originale con il ciclo for. Differenza trascurabile a meno che tu non abbia a che fare con milioni di elementi. +1 per la fantastica risposta: P –

10

quale è meglio per le prestazioni?

A chi importa? Non sarà significativo. Mai. Se questo tipo di piccole ottimizzazioni fossero importanti, non avresti usato PHP.

qual è il criterio per selezionare un ciclo?

Selezionare quello che è più facile da leggere e meno probabilità di causare errori in futuro. Quando esegui il looping di interi, i loop for sono ottimi.Quando esegui il ciclo di una raccolta come un array, lo foreach è ottimo, quando hai solo bisogno di eseguire il ciclo finché non hai finito, while è fantastico.

Questo può dipendere anche da regole stilistiche (ad esempio, in Python si desidera quasi sempre utilizzare un ciclo foreach perché questo è "il modo in cui è fatto in Python"). Non sono sicuro di quale sia lo standard in PHP.

che deve essere utilizzato quando eseguiamo il ciclo all'interno di un altro ciclo?

Qualunque tipo di loop abbia più senso (vedere la risposta sopra).

Nel proprio codice, il ciclo for mi sembra abbastanza naturale, poiché si dispone di un indice di avvio e arresto definito.

5
  • Per le prestazioni non importa se si sceglie un for o di un ciclo while, il numero di iterazioni determinare il tempo di esecuzione.
  • Se si conosce il numero di iterazioni al diritto, scegliere un ciclo for. Se si desidera eseguire e fermare su una condizione, utilizzare un ciclo while
7

Controllare http://www.phpbench.com/ per un buon riferimento su alcuni parametri di riferimento PHP.

Il ciclo for di solito è piuttosto veloce. Non includere il valore ($ file) o count ($ tutto) nella per se stesso, lo fa fuori in questo modo:

$count_all = count($all); 
for($i=0;$i<$count_all;$i++) 
{ 
    // Code here 
} 

Posizionamento del conteggio ($ tutto) nel ciclo for rende calcolare questa dichiarazione per ogni ciclo. Calcolando prima il valore e quindi utilizzando il calcolo nel ciclo, viene eseguito una volta sola.

+2

Non sei d'accordo con te su entrambi i punti qui. I benchmark non contano davvero: quale differenza nel mondo reale fanno 200 microsecondi in uno script PHP? Non ce ne saranno. E guarda il codice che mostri e confrontalo con 'foreach ($ all)'. Quale è più facile da leggere e mantenere? –

+0

Concordo, inoltre foreach è molto più bello da leggere. a volte i loop possono essere confusi con tutti i riferimenti alla chiave. – DevNinjaJeremy

2
  • ciclo for è più appropriato quando si sa in anticipo quanti iterazioni per eseguire
  • While viene utilizzato nel caso opposto (quando non si sa quanti sono necessari iterazioni)
  • Il ciclo For-Each è il migliore quando è necessario iterare sulle raccolte.

Per quanto a mia conoscenza, non v'è poca o nessuna differenza di prestazioni tra while e per il ciclo non so circa la for-each ciclo

0

Performance: Abbastanza facile testare. Se stai facendo qualcosa come apprendimento automatico o big data, dovresti davvero guardare qualcosa che è compilato o assemblato e non interpretato; se i cicli sono veramente. Here are some benchmarks between the various programming languages. Sembra che il ciclo do-while sia il vincitore sui miei sistemi utilizzando PHP con questi esempi.

$my_var = "some random phrase"; 

function fortify($my_var){ 
    for($x=0;isset($my_var[$x]);$x++){ 
     echo $my_var[$x]." "; 
    } 
} 

function whilst($my_var){ 
    $x=0; 
    while(isset($my_var[$x])){ 
     echo $my_var[$x]." "; 
     $x++; 
    } 
} 

function dowhilst($my_var){ 
    $x=0; 
    do { 
     echo $my_var[$x]." "; 
     $x++; 
    } while(isset($my_var[$x])); 
} 

function forstream(){ 
    for($x=0;$x<1000001;$x++){ 
     //simple reassignment 
     $v=$x; 
    } 
    return "For Count to $v completed"; 
} 

function whilestream(){ 
    $x=0; 
    while($x<1000001){ 
     $v=$x; 
     $x++; 
    } 
    return "While Count to 1000000 completed"; 
} 

function dowhilestream(){ 
    $x=0; 
    do { 
     $v=$x; 
     $x++; 
    } while ($x<1000001); 
    return "Do while Count to 1000000 completed"; 
} 

function dowhilestream2(){ 
    $x=0; 
    do { 
     $v=$x; 
     $x++; 
    } while ($x!=1000001); 
    return "Do while Count to 1000000 completed"; 
} 

$array = array(
    //for the first 3, we're adding a space after every character. 
     'fortify'=>$my_var, 
     'whilst'=>$my_var, 
     'dowhilst'=>$my_var, 
    //for these we're simply counting to 1,000,000 from 0 
    //assigning the value of x to v 
     'forstream'=>'', 
     'whilestream'=>'', 
     'dowhilestream'=>'', 
    //notice how on this one the != operator is slower than 
    //the < operator 
     'dowhilestream2'=>'' 
     ); 

function results($array){ 
    foreach($array as $function=>$params){ 


     if(empty($params)){ 
     $time= microtime(); 
     $results = call_user_func($function); 
     } elseif(!is_array($params)){ 
     $time= microtime(); 
     $results = call_user_func($function,$params); 
     } else { 
     $time= microtime(); 
     $results = call_user_func_array($function,$params); 
     } 
     $total = number_format(microtime() - $time,10); 
     echo "<fieldset><legend>Result of <em>$function</em></legend>".PHP_EOL; 
     if(!empty($results)){ 
      echo "<pre><code>".PHP_EOL; 
      var_dump($results); 
      echo PHP_EOL."</code></pre>".PHP_EOL; 
     } 
     echo "<p>Execution Time: $total</p></fieldset>".PHP_EOL; 
    } 
} 

results($array); 

Criteri:while, for e foreach sono le principali strutture di controllo molte persone usano in PHP. do-while è più veloce di while nei miei test, ma ampiamente sottoutilizzato nella maggior parte degli esempi di codifica PHP sul web.

for è il conteggio controllato, quindi itera un numero specifico di volte; anche se è più lento nei miei risultati rispetto all'utilizzo di un while per la stessa cosa.

while è buono quando qualcosa potrebbe iniziare come false, in modo che possa impedire a qualcosa di mai in esecuzione e sprecare risorse.

do-while almeno una volta, e quindi finché la condizione non restituisce false. È un po 'più veloce di un ciclo while nei miei risultati, ma verrà eseguito almeno una volta.

foreach è valido per iterare tramite array o object. Anche se è possibile eseguire il ciclo di una stringa con un'istruzione for utilizzando la sintassi degli array, non è possibile utilizzare foreach per farlo in PHP.

controllo Struttura Nesting: Dipende molto da quello che stai facendo per determinare mentre la struttura di controllo da utilizzare per la nidificazione. In alcuni casi, come la programmazione orientata agli oggetti, in realtà si desidera chiamare le funzioni che contengono le strutture di controllo (singolarmente) piuttosto che l'utilizzo di programmi massicci in stile procedurale che contengono molti controlli annidati. Questo può rendere più facile leggere, eseguire il debug e creare un'istanza.