2016-01-27 6 views
5

Ho un ciclo for nel mio codice. Non ho cambiato nulla in questa parte di codice per circa 5-6 giorni e non ho mai avuto problemi con esso.Perché il mio codice PHP non funziona più senza motivo?

Da ieri ho provato a ricaricare il mio codice e mi dà allways questo errore:

Maximum execution time of 30 seconds exceeded - in LogController.php line 270 

Beh, non riesco a spiegare perché, ma forse qualcuno di voi potuto guardare su di esso.

Questo è il mio codice intorno alla linea 270.

$topten_sites = []; 
for ($i = 0; $i <= count($sites_array); $i++) { 
    if ($i < 10) { // this is 270 
     $topten_sites[] = $sites_array[$i]; 
    } 
} 
$topten_sites = collect($topten_sites)->sortByDesc('number')->all(); 

Come ho detto, ha funzionato perfettamente, quindi perché mi dà un errore? Se annullo queste righe e ogni altra riga che contiene l'array $ topten_sites, il codice funziona di nuovo.

+1

qualcosa è strano nel vostro ciclo for, il $ i <= $ sites_array' parte '. Penso che dovrebbe essere '$ i <= count ($ sites_array)' – PrinceG

+0

Sono d'accordo con @PrinceG - che deve essere cambiato in un 'count ($ sites_array)' o 'sizeof ($ sites_array)' – RamRaider

+0

FYI http://www.icosaedro.it/phplint/ ha rilevato questo errore. –

risposta

15

Questo sembra sbagliato:

for ($i = 0; $i <= $sites_array; $i++) { 
     if ($i < 10) { // this is 270 
      $topten_sites[] = $sites_array[$i]; 
     } 
    } 

Se $sites_array è un array, non ha senso per confrontarlo con un intero quindi probabilmente si dispone di un loop senza fine.

Se avete solo bisogno i primi 10 elementi in un altro array, è possibile sostituire il ciclo con:

$topten_sites = array_slice($sites_array, 0, 10); 
+0

Oppure usa break per uccidere il ciclo quando hai finito con esso –

+1

ancora meglio. usa '$ i <10' come condizione per lo stato' for' – roullie

+1

Beh .. Funzionava perfettamente o.o Grazie per questo! Non so come sia apparso questo problema ma grazie! – ItzMe42

2

perché si iterare intero array se desideri solo i primi 10 risultati?

for ($i = 0; $i < 10; $i++) { 
      $topten_sites[] = $sites_array[$i]; 
    } 
1

Per rispondere alla risposta effettiva; il codice non smette mai di funzionare "senza motivo". Il codice funziona o no, sia per una ragione. Se smette di funzionare qualcosa modificato rispetto ai test precedenti. "A volte funziona, a volte non" rientra nella stessa logica. Il codice si comporterà sempre esattamente lo stesso ogni volta, solo alcuni dei parametri sono cambiati, devi trovare quale.

Nel tuo caso, credo che le voci nel tuo array siano aumentate. PHP e array non sono i migliori amici quando si tratta di velocità, gli array sono lenti. Potrebbe essere che il tuo array fosse più piccolo quando lo hai testato (non era il più veloce all'inizio), ma ora con la quantità corrente ha appena raggiunto la soglia di 30 secondi.

Potrebbe anche essere che una parte di codice prima di questo bit di codice richiede molto tempo (diciamo improvvisamente 28 secondi anziché 20), e il tuo ciclo (che non è mai cambiato) fa il lavoro nei normali 3 secondi, sempre fa, ora corre in problemi

0

usare in questo modo:

$topten_sites = []; 
    for ($i = 0; $i <= 10; $i++) { 
     $topten_sites[] = $sites_array[$i]; 
    } 
    $topten_sites = collect($topten_sites)->sortByDesc('number')->all(); 
+0

Perché l'OP dovrebbe "provare questo"?Una buona risposta *** avrà sempre una spiegazione di cosa è stato fatto e perché è stato fatto in quel modo, non solo per l'OP ma per i futuri visitatori di SO. –