2012-09-24 3 views
5

voglio anello da 1 fino a 5. Questo è facile se si utilizza un ciclo for:PHP: loop da 1 fino a 5 di partenza del 3

for ($i=1; $i<=5; $i++) 
{ 
// do something 
} 

Ma immaginate invece di partire da $ i = 1 Ho un numero di inizio casuale da 1 a 5 e questa volta il suo valore è 3. Quindi devo iniziare il ciclo da 3 e la sequenza del ciclo dovrebbe essere: 3,4,5,1,2

Ho già il numero di radom , diciamo che è 3, quindi ho bisogno di 3 4 5 1 2 .. se fosse 5, avrei bisogno di 5 1 2 3 4

Come posso fare questo ??

Grazie mille!

risposta

1

Prova questo:

for ($i = 0, $j = 3; $i < 5; $i++) 
{ 
    echo $j; 
    $j %= 5; 
    $j++; 
} 

Hai bisogno di due VAR di Fai quello che vuoi. Se si imposta J = 3, lo farà 3 4 5 1 2

divertirsi.

+0

esso stampa 4 2 e se $ j = a 3, ho bisogno di stampare 3 4 5 1 2 –

+0

ho appena aggiornato la mia risposta, questo dovrebbe funzionare adesso. – Weacked

+0

Essendo $ j = 3; stampa 3 2 che è grande perché inizia per 3 ma invece di 1 mostra 6 –

0
$i = array(3,4,5,1,2); //considering you want to follow this order, and not random. 
foreach($i as $v) { 
//do something 
} 
+0

che è hardcoded, voglio dire 3 è un numero casuale, il prossimo caricamento potrebbe essere 4 o 2 o 1 o 5 .. –

5

si vuole iniziare ad un certo punto casuale (l'offset) e poi fare un ciclo di 5:

$offset = rand(1,5); 
for ($i=1; $i<=5; $i++) 
{ 
    echo (($i + $offset) % 5) + 1; 
} 
+0

3 è un numero casuale, il prossimo caricamento potrebbe essere 4 o 2 o 1 o 5 –

+0

Aggiustato il mio rispondi allo – JvdBerg

+0

la tua serie produrrà '3, 4, 0, 1, 2'. – zzzzBov

2

Beh, $i itererà 1-5 che significa che è possibile effettuare un'altra variabile $j che è equivalente a $i + 2, ma naturalmente comporterebbe il conteggio di:

3, 4, 5, 6, 7 

che è dove il modulo operatore (%) entra in gioco, l'operatore modulo ti dà il resto dopo la divisione per il secondo numero:

3 % 5 //3 
7 % 5 //2 

Se iterat e 1-5 e aggiungere 2 (3-7), e prendere il risultato mod(5), si otterrebbe:

Equazione:

$j = ($i + 2) % 5 

3, 4, 0, 1, 2 

Questa è vicino a ciò che si vuole, ma non del tutto. Così, invece di aggiungere 2 inizialmente, aggiungere 1 inizialmente, e di nuovo dopo il risultato del modulo:

$j = $i; 
$j += 1; 
$j %= 5; 
$j += 1; 
//or in one line: 
$j = (($i + 1) % 5) + 1; 

che vi darà una serie di 3, 4, 5, 1, 2.

Per utilizzare un casuale offset, basta assicurarsi che l'imbottitura iniziale è randomizzati in un set di 5 numeri interi positivi consecutivi:

//this could be rand(0, 4) or rand(101, 105) 
//it doesn't actually matter which range of 5 integers 
//as the modulus operator will bound the results to the range of 0-4 
$offset = rand(1, 5); 
for ($i = 1; $i <= 5; $i++) { 
    $j = (($i + $offset) % 5) + 1; 
} 
1

Alcuni (meglio del mio precedente) esempio step-by-step:

Prima di tutto vuoi avere 5 numeri, ecco perché fai il ciclo.Questo può essere scritto come contatore da 0 a 4:

for ($i = 0; $i < 5; $i++) { ... 

Quindi si specifica il valore iniziale. Se lo metti in una variabile e aumentare insieme con la variabile del contatore, questa permette di contare da 1 a 5:

for ($i = 0, $j = 1; $i < 5; $i++, $j++) { ... 
      ^^^^^^    ^^^^ 

Qui $i è il contatore e $j contiene il valore che stai cercando.

Come illustrato in questo esempio, la logica per determinare il numero di passaggi da eseguire è stata separata dall'aumento della variabile del ciclo.

Ora è necessario aggiungere un controllo se $j supera il 5 e se lo fa dovrebbe essere ripristinato a 1. Tuttavia, un buon modo per farlo è quello di utilizzare l'operatore modulo. Ciò significa che, prima di aumentare $j, sarà impostato al resto del sé diviso per 5. Questo è l'operazione modulo, % operatore in PHP:

for ($i = 0, $j = 3; $i < 5; $i++, $j %= 5, $j++) { ... 
            ^^^^^^^ 

E ora hai la tua for ciclo che sta creando il valore.

In questo esempio è possibile sostituire 3 con il numero di avvio casuale. Fai attenzione che sia maggiore di 0 e inferiore a 6, altrimenti almeno la prima iterazione ti darebbe un numero sbagliato.

Come potete immaginare ci sono molti modi per farlo, quindi questo è solo un esempio.