2016-02-01 17 views
23

Quando si utilizza un tipico ciclo for, PHPStorm suggerisce di modificarlo per prestazioni migliori. Non capisco davvero il suggerimento. Come dovrei cambiarlo?Migliora PHP 'for' loop

PHPStorm suggestion

+2

Qual è il suggerimento PhpStorm quando si fa clic su ** ** di più? Sono curioso di sapere perché PHPStorm lo suggerisce. – jedema

+0

c'è solo 'analisi per cicli e riporta l'utilizzo di blablabla' :) – simPod

+1

' foreach' e dimenticare – Kzqai

risposta

55

for($i = 0; $i <= count($data); $i++){}

In questo esempio per ogni iterazione deve essere nuovamente impostato su count($data).

for($i = 0, $iMax = count($data); $i <= $iMax; $i++){}

In questo esempio ha solo bisogno di count($data) volta.

Questa è la differenza.

+1

Per riferimento vedere [questo post] (http://stackoverflow.com/a/12847555/2865814) –

+2

Presumibilmente ciò presuppone che ' $ data' non cambia la lunghezza all'interno del ciclo, o i due sarebbero diversi. – abligh

+4

@abligh Se '$ data' cambia lunghezza all'interno del ciclo for, probabilmente non si dovrebbe usare un ciclo for in primo luogo. Potrei essere di parte, però, non penso che dovresti mai usare un ciclo for. – Odalrick

14

Se si esegue il count() all'interno del vostro for ciclo, allora è eseguito ogni iterazione, e chiamare la funzione è un sovraccarico di prestazioni.

Se invece si chiama count() prima del ciclo for e assegnare il risultato a una variabile, quindi confrontare con la variabile nel ciclo for, non haver l'overhead chiamata di funzione, quindi è più veloce

12

Avendo il ciclo nel modo in cui si esegue, ogni iterazione deve valutare count($data). Se nella lista ci sono molti articoli, potrebbe essere necessario un po '(relativamente) per contare quegli articoli, e deve farlo ogni volta.

Il suggerimento di immersione è impostare una variabile sul valore di conteggio ($ dati) all'inizio e quindi utilizzare tale variabile come limite del ciclo, quando viene valutata solo una volta.

questo può essere fatto in due modi:

$loopMax = count($data); 
for ($i = 0; $i <= $loopMax; $i++) { 
    // Your code here 
} 

O

for ($i=0, $loopMax = count($data); $i <= $loopMax; $i++) { 
    // your code here 
} 
+0

Quello superiore è ovviamente preferito se si sta andando a scorrere più volte per qualche motivo. Il fondo è preferito in altre occasioni perché dovresti sempre cercare di limitare l'ambito delle tue variabili. – corsiKa

+0

L'uso di quello superiore non si limita a quando lo si itera su più volte, sarebbe anche utile se l'applicazione, ad esempio, ha bisogno di generare il conteggio; forse per qualche impaginazione o simili. Ma sì, l'ambito delle variabili dovrebbe essere limitato dove necessario. – gabe3886